/ Hex Artifact Content
Login

Artifact ee340ad90103fe70526f7b0c3728d185dd470f20:


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 35 31 20 32 30 30 38 2f 30  c,v 1.451 2008/0
0190: 34 2f 30 33 20 32 31 3a 34 36 3a 35 37 20 64 72  4/03 21:46:57 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 50 67 6e 6f 2c 42 74 43 75 72  tree*,Pgno,BtCur
07e0: 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65 66 20  sor*);...#ifdef 
07f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0800: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
0810: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
0820: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0830: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
0840: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
0850: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
0860: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0870: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0880: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0890: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
08a0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
08b0: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
08c0: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
08d0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
08e0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
08f0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0900: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0910: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0920: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0930: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0940: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0950: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0960: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0970: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0980: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0990: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
09a0: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
09b0: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
09c0: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
09d0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
09e0: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
09f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0a00: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
0a10: 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a  bles(a).#endif..
0a20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0a30: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0a40: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
0a50: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
0a60: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
0a70: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
0a80: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
0a90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0aa0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
0ab0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
0ac0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
0ad0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
0ae0: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
0af0: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
0b00: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
0b10: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
0b20: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
0b30: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
0b40: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0b50: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0b60: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0b70: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0b80: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0b90: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0ba0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0bb0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 0a 20  Mutex(p) );.  . 
0bc0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f   /* This is a no
0bd0: 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65  -op if the share
0be0: 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65  d-cache is not e
0bf0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
0c00: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  !p->sharable ){.
0c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
0c30: 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  If some other co
0c40: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
0c50: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
0c60: 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20   lock, the.  ** 
0c70: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d  requested lock m
0c80: 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ay not be obtain
0c90: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
0ca0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 26  Bt->pExclusive &
0cb0: 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  & pBt->pExclusiv
0cc0: 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75  e!=p ){.    retu
0cd0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0ce0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
0cf0: 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63   (along with loc
0d00: 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65  kTable()) is whe
0d10: 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  re the ReadUncom
0d20: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20  mitted flag is. 
0d30: 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20   ** dealt with. 
0d40: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
0d50: 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20   querying for a 
0d60: 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68  read-lock and th
0d70: 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73  e flag is.  ** s
0d80: 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64  et, it is uncond
0d90: 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65  itionally grante
0da0: 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72  d - even if ther
0db0: 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b  e are write-lock
0dc0: 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61  s.  ** on the ta
0dd0: 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ble. If a write-
0de0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
0df0: 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  d, the ReadUncom
0e00: 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a  mitted flag.  **
0e10: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
0e20: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  ed..  **.  ** In
0e30: 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61   function lockTa
0e40: 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64  ble(), if a read
0e50: 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65  -lock is demande
0e60: 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  d and the .  ** 
0e70: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0e80: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20  flag is set, no 
0e90: 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74  entry is added t
0ea0: 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74  o the locks list
0eb0: 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64   .  ** (BtShared
0ec0: 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20  .pLock)..  **.  
0ed0: 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a  ** To summarize:
0ee0: 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f   If the ReadUnco
0ef0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
0f00: 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  set, then read c
0f10: 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e  ursors do.  ** n
0f20: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
0f30: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
0f40: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  . The locking pr
0f50: 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20  ocedure for a . 
0f60: 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72   ** write-cursor
0f70: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
0f80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
0f90: 20 20 21 70 2d 3e 64 62 20 7c 7c 20 0a 20 20 20    !p->db || .   
0fa0: 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67   0==(p->db->flag
0fb0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0fc0: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0fd0: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0fe0: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0ff0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1000: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
1010: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1020: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1030: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1040: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1050: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
1060: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
1070: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
1080: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
1090: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
10c0: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
10d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10f0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1100: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1110: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1130: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
1140: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
1150: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1160: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
1170: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
1180: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
1190: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
11a0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
11b0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
11c0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
11d0: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
11e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
11f0: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1200: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1210: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1220: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
1230: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
1240: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1250: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
1260: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
1270: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
1280: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1290: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
12a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
12b0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
12c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
12d0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
12e0: 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  tex(p) );..  /* 
12f0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1300: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1310: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1320: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1330: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1340: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1360: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
1370: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
1380: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
1390: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
13a0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
13b0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
13c0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
13d0: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
13e0: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
13f0: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1400: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1410: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1420: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1430: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
1440: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
1450: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
1460: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
1470: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
1480: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
1490: 20 0a 20 20 20 20 28 70 2d 3e 64 62 29 20 26 26   .    (p->db) &&
14a0: 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c   .    (p->db->fl
14b0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
14c0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a  ncommitted) && .
14d0: 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44      (eLock==READ
14e0: 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54  _LOCK) &&.    iT
14f0: 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f  able!=MASTER_ROO
1500: 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T.  ){.    retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1520: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61  ..  /* First sea
1530: 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72  rch the list for
1540: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63   an existing loc
1550: 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  k on this table.
1560: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
1570: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1580: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1590: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
15a0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
15b0: 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e  Table && pIter->
15c0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
15d0: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72     pLock = pIter
15e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1600: 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72  f the above sear
1610: 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  ch did not find 
1620: 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20  a BtLock struct 
1630: 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65  associating Btre
1640: 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61  e p.  ** with ta
1650: 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f  ble iTable, allo
1660: 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e  cate one and lin
1670: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
1680: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  st..  */.  if( !
1690: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
16a0: 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73  ck = (BtLock *)s
16b0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
16c0: 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29  (sizeof(BtLock))
16d0: 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b  ;.    if( !pLock
16e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1700: 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e     }.    pLock->
1710: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
1720: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  .    pLock->pBtr
1730: 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63  ee = p;.    pLoc
1740: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  k->pNext = pBt->
1750: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
1760: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
1770: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1780: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61   BtLock.eLock va
1790: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61  riable to the ma
17a0: 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72  ximum of the cur
17b0: 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61  rent lock.  ** a
17c0: 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
17d0: 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e   lock. This mean
17e0: 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  s if a write-loc
17f0: 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65  k was already he
1800: 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  ld.  ** and a re
1810: 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65  ad-lock requeste
1820: 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f  d, we don't inco
1830: 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64  rrectly downgrad
1840: 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  e the lock..  */
1850: 0a 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45  .  assert( WRITE
1860: 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20  _LOCK>READ_LOCK 
1870: 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70  );.  if( eLock>p
1880: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20  Lock->eLock ){. 
1890: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
18a0: 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = eLock;.  }..  
18b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
18d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
18e0: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
18f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1900: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
1910: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74  ** Release all t
1920: 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28  he table locks (
1930: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76  locks obtained v
1940: 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  ia calls to the 
1950: 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70  lockTable().** p
1960: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
1970: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
1980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1990: 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
19a0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
19b0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19c0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
19d0: 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e  *ppIter = &pBt->
19e0: 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74  pLock;..  assert
19f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1a00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1a10: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
1a20: 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74  able || 0==*ppIt
1a30: 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  er );..  while( 
1a40: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
1a50: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
1a60: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
1a70: 72 74 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73  rt( pBt->pExclus
1a80: 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  ive==0 || pBt->p
1a90: 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b  Exclusive==pLock
1aa0: 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20  ->pBtree );.    
1ab0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1ac0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
1ad0: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
1ae0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1af0: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
1b00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b10: 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63    ppIter = &pLoc
1b20: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
1b30: 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
1b40: 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b  pExclusive==p ){
1b50: 0a 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75  .    pBt->pExclu
1b60: 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  sive = 0;.  }.}.
1b70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b80: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b90: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
1ba0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
1bb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
1bc0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
1bd0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
1be0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1bf0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
1c00: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1c10: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
1c20: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
1c30: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
1c40: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
1c50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
1c70: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
1c80: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
1c90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1ca0: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
1cb0: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
1cc0: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1cd0: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
1ce0: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
1cf0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
1d00: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1d10: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
1d20: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1d30: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d40: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
1d50: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
1d60: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
1d70: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
1d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
1d90: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1da0: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1db0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
1dc0: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
1dd0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
1de0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
1df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
1e00: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e10: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
1e20: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
1e30: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
1e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e60: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
1e70: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1e80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
1e90: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1ea0: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23  ache(p);.  }.}.#
1eb0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69  else.  #define i
1ec0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
1ed0: 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66  wCache(x).  #def
1ee0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ine invalidateAl
1ef0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  lOverflowCache(x
1f00: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1f10: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1f20: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1f30: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
1f40: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
1f50: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
1f60: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
1f70: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
1f80: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
1f90: 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69  RESEEK..*/.stati
1fa0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
1fb0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
1fc0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
1fd0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
1fe0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
1ff0: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
2000: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
2010: 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  pKey );.  assert
2020: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2030: 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72  ex(pCur) );..  r
2040: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2050: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
2060: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f  Cur->nKey);..  /
2070: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2080: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
2090: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
20a0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
20b0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
20c0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
20d0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
20e0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
20f0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
2100: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
2110: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
2120: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
2130: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
2140: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
2150: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
2160: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
2170: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
2180: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
2190: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
21a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21b0: 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d   0==pCur->pPage-
21c0: 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f  >intKey){.    vo
21d0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
21e0: 65 33 5f 6d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  e3_malloc(pCur->
21f0: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  nKey);.    if( p
2200: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
2210: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
2220: 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d  y(pCur, 0, pCur-
2230: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
2240: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2260: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
2270: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
2280: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2290: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
22a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
22b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
22d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
22e0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
22f0: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
2300: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
2310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2320: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
2330: 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
2340: 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20  ur->pPage = 0;. 
2350: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2360: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
2370: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
2380: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2390: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
23a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23b0: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
23c0: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
23d0: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
23e0: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
23f0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
2400: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
2410: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
2420: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
2430: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
2440: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
2450: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
2460: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
2470: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
2480: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2490: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
24a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
24b0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
24c0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
24d0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
24e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2500: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2510: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
2520: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
2530: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
2540: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2550: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2560: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2570: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2580: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2590: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
25a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
25b0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
25c0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
25d0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
25e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
25f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
2600: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2620: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2630: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
2640: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2650: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2670: 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2680: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2690: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
26a0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26b0: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
26c0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
26d0: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
26e0: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
26f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2700: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
2710: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
2720: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
2730: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
2740: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
2750: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
2760: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
2770: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
2780: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
2790: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
27a0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
27b0: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
27c0: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
27d0: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
27e0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
27f0: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
2800: 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c  tive restoreOrCl
2810: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2820: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
2830: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
2840: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a  orPosition()..**
2850: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
2860: 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d  d argument argum
2870: 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69  ent - doSeek - i
2880: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  s false, then in
2890: 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74  stead of .** ret
28a0: 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  urning the curso
28b0: 72 20 74 6f 20 69 74 73 20 73 61 76 65 64 20 70  r to its saved p
28c0: 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76  osition, any sav
28d0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64  ed position is d
28e0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  eleted.** and th
28f0: 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 73  e cursor state s
2900: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56  et to CURSOR_INV
2910: 41 4c 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ALID..*/.int sql
2920: 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65  ite3BtreeRestore
2930: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2940: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2950: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2960: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2970: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2980: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2990: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
29a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
29b0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
29c0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
29d0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
29e0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
29f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2a00: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2a10: 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
2a20: 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 7b 0a 20  rblobHandle ){. 
2a30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a40: 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
2a50: 69 66 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  if.  pCur->eStat
2a60: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2a70: 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ID;.  rc = sqlit
2a80: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2a90: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
2aa0: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  0, pCur->nKey, 0
2ab0: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
2ac0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ae0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
2af0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
2b00: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
2b10: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2b20: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2b30: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2b40: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2b50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b60: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
2b70: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2b80: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
2b90: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
2ba0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2bb0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
2bc0: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2bd0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2be0: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
2bf0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
2c00: 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  K)..#ifndef SQLI
2c10: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c20: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
2c30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2c40: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
2c50: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
2c60: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2c70: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
2c80: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
2c90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
2ca0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
2cb0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
2cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
2cd0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
2ce0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2cf0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
2d00: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
2d10: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
2d20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2d40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
2d50: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
2d60: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2d70: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
2d80: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
2d90: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
2da0: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
2db0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
2dc0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
2dd0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2de0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2df0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
2e00: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
2e10: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
2e20: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
2e30: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
2e40: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
2e50: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
2e60: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
2e70: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
2e80: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
2e90: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
2ea0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
2eb0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
2ec0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
2ed0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ee0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
2ef0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
2f00: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
2f10: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
2f20: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
2f30: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
2f40: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
2f50: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
2f60: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
2f70: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
2f80: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
2f90: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
2fa0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
2fb0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
2fc0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
2fd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
2fe0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
2ff0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
3000: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
3010: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
3020: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3030: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3040: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3050: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3060: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3070: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3080: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3090: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
30a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
30b0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
30c0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
30d0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
30e0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
30f0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
3100: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
3110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3120: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3130: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3140: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3150: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3160: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3170: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3180: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3190: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31a0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
31b0: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
31c0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
31d0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
31e0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
31f0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
3200: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
3210: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3220: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3230: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3240: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3250: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3260: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3270: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3280: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3290: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
32a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32b0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
32c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
32e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
32f0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
3300: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3310: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3330: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3340: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3350: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3360: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3370: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3380: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3390: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
33a0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
33b0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
33c0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
33d0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
33e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
33f0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
3400: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
3410: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3420: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3430: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3440: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3450: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3470: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3480: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3490: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
34a0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
34b0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
34c0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
34d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
34e0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
34f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
3500: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
3510: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3520: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3530: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3540: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3550: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3560: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3570: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3580: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35b0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
35c0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
35d0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
35e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
35f0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
3600: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3610: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3620: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3630: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3640: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3650: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3660: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3670: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
3680: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
3690: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
36a0: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
36b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
36c0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
36d0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
36e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
36f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
3700: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3710: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3720: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3760: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3770: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3780: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
3790: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
37a0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
37b0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
37c0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
37d0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
37e0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
37f0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
3800: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
3810: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
3820: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
3830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
3840: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
3850: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
3860: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3870: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
3880: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3890: 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50   iCell) \.  ((pP
38a0: 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65  age)->aData + ge
38b0: 74 32 62 79 74 65 28 26 28 70 50 61 67 65 29 2d  t2byte(&(pPage)-
38c0: 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e  >aData[(pPage)->
38d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43  cellOffset+2*(iC
38e0: 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65 66 20 53  ell)])).#ifdef S
38f0: 51 4c 49 54 45 5f 54 45 53 54 0a 75 38 20 2a 73  QLITE_TEST.u8 *s
3900: 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43  qlite3BtreeFindC
3910: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
3920: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
3930: 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e    assert( iCell>
3940: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3950: 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26  iCell<get2byte(&
3960: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
3970: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
3980: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 69  ) );.  return fi
3990: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
39a0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
39b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
39c0: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
39d0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  n of sqlite3Btre
39e0: 65 46 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74  eFindCell() that
39f0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
3a00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
3a10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3a20: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
3a30: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
3a40: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
3a50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
3a60: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
3a70: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
3a80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3a90: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3aa0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3ab0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3ac0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3ad0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3ae0: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3af0: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
3b00: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
3b10: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
3b20: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
3b30: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3b40: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3b50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3b60: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3b80: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3b90: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3ba0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3bc0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3bd0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
3be0: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
3bf0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
3c00: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
3c10: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
3c20: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
3c30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3c40: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3c50: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3c60: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
3c70: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3c80: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
3c90: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
3ca0: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
3cb0: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
3cc0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
3cd0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
3ce0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
3cf0: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
3d00: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
3d10: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
3d20: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3d30: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
3d40: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
3d50: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
3d60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d70: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3d80: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
3d90: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
3da0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
3db0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
3dc0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
3dd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3de0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
3df0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
3e00: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
3e10: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
3e20: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
3e30: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
3e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3e50: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
3e60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
3e70: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
3e80: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
3e90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3ea0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
3eb0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
3ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3ed0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
3ee0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
3ef0: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
3f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
3f10: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
3f20: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
3f30: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
3f40: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
3f50: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
3f60: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
3f70: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
3f80: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3f90: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
3fa0: 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  ], &nPayload);. 
3fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
3fc0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  load = 0;.  }.  
3fd0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
3fe0: 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70  Payload;.  if( p
3ff0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
4000: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
4010: 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75  nt(&pCell[n], (u
4020: 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  64 *)&pInfo->nKe
4030: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
4040: 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d   u32 x;.    n +=
4050: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
4060: 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20  ell[n], &x);.   
4070: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78   pInfo->nKey = x
4080: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  ;.    nPayload +
4090: 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  = x;.  }.  pInfo
40a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
40b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
40c0: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69  nHeader = n;.  i
40d0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
40e0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
40f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
4100: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
4110: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
4120: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
4130: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
4140: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
4150: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
4160: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
4170: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
4180: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
4190: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
41a0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
41b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
41c0: 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  al = nPayload;. 
41d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
41e0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69  low = 0;.    nSi
41f0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
4200: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  n;.    if( nSize
4210: 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  <4 ){.      nSiz
4220: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
4230: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
4240: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
4250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
4260: 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  e = nSize;.  }el
4270: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4280: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
4290: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
42a0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
42b0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
42c0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
42d0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
42e0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
42f0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
4300: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
4310: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
4320: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
4330: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
4340: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
4350: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
4360: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
4370: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
4380: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
4390: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
43a0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
43b0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
43c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
43d0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
43e0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
43f0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
4400: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
4410: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
4420: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
4430: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
4440: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
4450: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
4460: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
4470: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
4480: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
4490: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
44a0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
44b0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
44c0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
44d0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
44e0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
44f0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
4500: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
4510: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
4520: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
4530: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
4540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
4550: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
4560: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
4570: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
4580: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
4590: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
45a0: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
45b0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
45c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
45d0: 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20  al = surplus;.  
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
45f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d  Info->nLocal = m
4600: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
4610: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
4620: 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  low = pInfo->nLo
4630: 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  cal + n;.    pIn
4640: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
4650: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
4660: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
4670: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4680: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
4690: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
46a0: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
46b0: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
46c0: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
46d0: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
46e0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
46f0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
4700: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
4710: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
4720: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
4730: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4750: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
4760: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
4770: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
4780: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
4790: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
47a0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
47b0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
47c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
47d0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
47e0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
47f0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
4800: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
4810: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
4820: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
4830: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
4840: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
4850: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4860: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
4870: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
4880: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
4890: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
48a0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
48b0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
48c0: 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  er..*/.#ifndef N
48d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
48e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
48f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
4900: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
4910: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
4920: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
4930: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
4940: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
4950: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
4960: 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  if.static u16 ce
4970: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
4980: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
4990: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
49a0: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
49b0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49c0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49d0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
49e0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
49f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4a00: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
4a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
4a20: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
4a30: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4a40: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4a50: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4a60: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4a70: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4a80: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4a90: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4aa0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
4ab0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
4ac0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4ad0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ae0: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
4af0: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
4b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
4b10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
4b20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
4b30: 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
4b40: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4b50: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4b60: 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
4b70: 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
4b80: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
4b90: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4ba0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
4bb0: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
4bc0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4bd0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4be0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
4c00: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
4c10: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
4c20: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
4c30: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
4c40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4c50: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4c60: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4c70: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4c80: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4c90: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4ca0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4cb0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4cc0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4cd0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4ce0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4cf0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4d00: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4d10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4d20: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4d30: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4d40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4d50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4d60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4d70: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4d80: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4d90: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4da0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4db0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4dc0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4dd0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4de0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4df0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4e00: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4e10: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4e20: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4e30: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
4e40: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
4e50: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
4e60: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
4e70: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
4e80: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
4e90: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
4ea0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
4eb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
4ec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
4ed0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4f00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4f30: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
4f40: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f60: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
4f70: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
4f80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
4f90: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
4fc0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
4fd0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4ff0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
5000: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
5010: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5020: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
5030: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5040: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5050: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
5060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
5070: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
5080: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
5090: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
50a0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
50b0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
50c0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
50d0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
50f0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
5100: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
5110: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5120: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
5130: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5140: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5150: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
5160: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
5170: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
5180: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5190: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
51a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
51b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
51c0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
51d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
51e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
51f0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
5200: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
5210: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5220: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
5230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5240: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5250: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
5260: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
5270: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
5280: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
5290: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
52a0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
52b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
52c0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
52d0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
52e0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
52f0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
5300: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
5310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5320: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
5330: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5340: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
5350: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5360: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5370: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
5380: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
5390: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
53a0: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
53b0: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
53c0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
53d0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
53e0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
53f0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
5400: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
5410: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
5420: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
5430: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
5440: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
5450: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5460: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
5470: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
5480: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
5490: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
54a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
54b0: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
54c0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
54d0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
54e0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
54f0: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
5500: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
5510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5520: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
5530: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
5540: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
5550: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
5560: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
5570: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
5580: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5590: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
55a0: 64 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  dr);.  return SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
55c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
55d0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
55e0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
55f0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
5600: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
5610: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
5620: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
5630: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
5640: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
5650: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
5660: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
5670: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
5680: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
5690: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
56a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
56b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
56c0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
56d0: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
56e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
56f0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
5700: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
5710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
5720: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
5730: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
5740: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
5750: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
5760: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
5770: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
5780: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
5790: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
57a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
57b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
57c0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
57d0: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
57e0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
57f0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
5800: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
5810: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
5820: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
5830: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
5840: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
5850: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5860: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5870: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5880: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5890: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
58a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
58b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
58c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
58d0: 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65 20  nByte<4 ) nByte 
58e0: 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 4;.  if( pPage
58f0: 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c  ->nFree<nByte ||
5900: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5910: 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  w>0 ) return 0;.
5920: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
5930: 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  = nByte;.  hdr =
5940: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5950: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
5960: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
5970: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
5980: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
5990: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
59a0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
59b0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
59c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
59d0: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
59e0: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
59f0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
5a00: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5a10: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
5a20: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
5a30: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
5a40: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
5a50: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
5a60: 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65    if( size<nByte
5a70: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +4 ){.          
5a80: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
5a90: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
5aa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
5ab0: 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67  a[hdr+7] = nFrag
5ac0: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5ad0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ae0: 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n pc;.        }e
5af0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5b00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
5b10: 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29  +2], size-nByte)
5b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5b30: 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e  rn pc + size - n
5b40: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Byte;.        }.
5b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
5b60: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20  dr = pc;.    }. 
5b70: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
5b80: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
5b90: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
5ba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
5bb0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
5bc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5bd0: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
5be0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5bf0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e  ata[hdr+5]);.  n
5c00: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
5c10: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
5c20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5c30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
5c40: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
5c50: 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b   || cellOffset +
5c60: 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d   2*nCell > top -
5c70: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69 66   nByte ){.    if
5c80: 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  ( defragmentPage
5c90: 28 70 50 61 67 65 29 20 29 20 72 65 74 75 72 6e  (pPage) ) return
5ca0: 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65   0;.    top = ge
5cb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5cc0: 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20  +5]);.  }.  top 
5cd0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  -= nByte;.  asse
5ce0: 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  rt( cellOffset +
5cf0: 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20   2*nCell <= top 
5d00: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
5d10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
5d20: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
5d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d40: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
5d50: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
5d60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
5d70: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
5d80: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
5d90: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
5da0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
5db0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
5dc0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
5dd0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
5de0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
5df0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
5e00: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
5e10: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
5e20: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
5e30: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
5e40: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
5e50: 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63  ic void freeSpac
5e60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
5e70: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
5e80: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
5e90: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
5ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5eb0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
5ec0: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
5ed0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
5ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5ef0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
5f00: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
5f10: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
5f20: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
5f30: 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
5f40: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b  ge->leaf?0:4) );
5f50: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
5f60: 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65  t + size)<=pPage
5f70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5f80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
5f90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5fa0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5fb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73 69  tex) );.  if( si
5fc0: 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b  ze<4 ) size = 4;
5fd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5fe0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
5ff0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
6000: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
6010: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
6020: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
6030: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
6040: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
6050: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
6060: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
6070: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
6080: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
6090: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
60a0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
60b0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
60c0: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
60d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
60e0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
60f0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
6100: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6110: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
6120: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
6130: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6140: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6160: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6170: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
6180: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6190: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
61a0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
61b0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
61c0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
61d0: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
61e0: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
61f0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
6200: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
6210: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
6220: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
6230: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
6240: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
6250: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65  e->nFree += size
6260: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
6270: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
6280: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
6290: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
62a0: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
62b0: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
62c0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
62d0: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
62e0: 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20  next, psize;.   
62f0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
6300: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
6310: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6320: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6330: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
6340: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
6350: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
6360: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
6370: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
6380: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
6390: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
63a0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
63b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
63c0: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
63d0: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
63e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61       assert( fra
63f0: 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  g<=data[pPage->h
6400: 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20  drOffset+7] );. 
6410: 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d       data[pPage-
6420: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d  >hdrOffset+7] -=
6430: 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74   frag;.      put
6440: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6450: 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64  in], get2byte(&d
6460: 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20  ata[pnext]));.  
6470: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6480: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e  ta[pbegin+2], pn
6490: 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61  ext+get2byte(&da
64a0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65  ta[pnext+2])-pbe
64b0: 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gin);.    }else{
64c0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
64d0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
64e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
64f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
6500: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
6510: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
6520: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
6530: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
6540: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
6550: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
6560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
6570: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
6580: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6590: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
65a0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
65b0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
65c0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
65e0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
65f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
6600: 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  op + get2byte(&d
6610: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b  ata[pbegin+2]));
6620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
6630: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
6640: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
6650: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
6660: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
6670: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
6680: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
6690: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
66a0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
66b0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
66c0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
66d0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
66e0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
66f0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
6700: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
6710: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
6720: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6730: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6740: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6750: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6770: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6780: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e  ) );.  pPage->in
6790: 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65  tKey = (flagByte
67a0: 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50   & (PTF_INTKEY|P
67b0: 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30  TF_LEAFDATA))!=0
67c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44  ;.  pPage->zeroD
67d0: 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20  ata = (flagByte 
67e0: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
67f0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
6800: 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  f = (flagByte & 
6810: 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20  PTF_LEAF)!=0;.  
6820: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
6830: 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e  ize = 4*(pPage->
6840: 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20  leaf==0);.  pBt 
6850: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
6860: 69 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50  if( flagByte & P
6870: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20  TF_LEAFDATA ){. 
6880: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
6890: 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ta = 1;.    pPag
68a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
68b0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
68c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
68d0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
68e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
68f0: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30  ge->leafData = 0
6900: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6910: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6920: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6930: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6940: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->minLocal;.  }.
6950: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6960: 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f   = !(pPage->zero
6970: 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d  Data || (!pPage-
6980: 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e  >leaf && pPage->
6990: 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f  leafData));.}../
69a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
69b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
69c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
69d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
69e0: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61  * The pParent pa
69f0: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
6a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a10: 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a   MemPage which.*
6a20: 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  * is the parent 
6a30: 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  of the page bein
6a40: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  g initialized.  
6a50: 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a  The root of a.**
6a60: 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61   BTree has no pa
6a70: 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20  rent and so for 
6a80: 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65  that page, pPare
6a90: 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  nt==NULL..**.** 
6aa0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6ab0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
6ac0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
6ad0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
6ae0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
6af0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
6b00: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
6b10: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
6b20: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
6b30: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
6b40: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
6b50: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
6b60: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
6b70: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
6b80: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
6b90: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
6ba0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
6bb0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
6bc0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
6bd0: 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
6be0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
6bf0: 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 69  The page to be i
6c00: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
6c10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
6c20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6c30: 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  rent.  Might be 
6c40: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
6c50: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
6c60: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
6c70: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
6c80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
6c90: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6cb0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
6cc0: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
6cd0: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
6ce0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
6cf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
6d00: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
6d10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
6d20: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
6d30: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
6d40: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
6d50: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
6d60: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
6d70: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
6d80: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
6d90: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
6da0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
6db0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
6dc0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
6dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6de0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
6df0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
6e00: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
6e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
6e20: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
6e30: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
6e40: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6e50: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
6e60: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
6e70: 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  t( pParent==0 ||
6e80: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
6e90: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
6ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6eb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6ed0: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
6ee0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
6ef0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6f10: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
6f20: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
6f30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
6f50: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
6f60: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
6f70: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6f80: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
6f90: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
6fa0: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
6fb0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
6fc0: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
6fd0: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
6fe0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
6ff0: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
7000: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
7010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7020: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7030: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7040: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
7050: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7060: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
7070: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
7080: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
7090: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
70a0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
70b0: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
70c0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
70d0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
70e0: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
70f0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
7100: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7110: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
7120: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
7130: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
7140: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
7150: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
7160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
7170: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
7180: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
7190: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
71a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
71b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
71c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
71d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
71e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
71f0: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
7200: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
7210: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
7220: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
7230: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
7240: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
7250: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
7260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7270: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7280: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
7290: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
72a0: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
72b0: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
72c0: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
72d0: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
72e0: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
72f0: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
7300: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7310: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7320: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
7330: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
7340: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
7350: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
7360: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7370: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
7380: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
7390: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
73a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
73b0: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
73c0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
73d0: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
73e0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
73f0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
7400: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
7410: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
7420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7430: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7440: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
7450: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7460: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
7470: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7480: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
7490: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
74a0: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
74b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
74c0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
74d0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
74e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
74f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7500: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
7510: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
7520: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
7530: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
7540: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
7550: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
7560: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
7570: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
7580: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
7590: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
75a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
75b0: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
75c0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
75f0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
7600: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
7610: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
7620: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
7630: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
7640: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
7650: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
7660: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
7670: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7680: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7690: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
76a0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
76b0: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
76c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
76d0: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
76e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
76f0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
7700: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7710: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
7720: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7730: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7740: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7750: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
7760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7770: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7780: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7790: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
77a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
77b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
77c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
77d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
77e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
77f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d  t->mutex) );.  m
7800: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
7810: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
7820: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64  Size - hdr);.  d
7830: 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73  ata[hdr] = flags
7840: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
7850: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
7860: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20  PTF_LEAF)==0);. 
7870: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
7880: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
7890: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
78a0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
78b0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
78c0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
78d0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
78e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
78f0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
7900: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
7910: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7920: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
7930: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
7940: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
7950: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
7960: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
7970: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
7980: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
7990: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
79b0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
79c0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
79d0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
79e0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
79f0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
7a00: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
7a10: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
7a20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
7a30: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
7a40: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
7a50: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
7a60: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
7a70: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
7a80: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
7a90: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
7aa0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
7ab0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
7ac0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
7ad0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
7ae0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
7af0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
7b00: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
7b10: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
7b20: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
7b30: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
7b40: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
7b50: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
7b60: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
7b70: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
7b80: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
7b90: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7ba0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7bb0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
7bc0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
7bd0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7be0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7bf0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
7c00: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
7c10: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
7c20: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
7c30: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
7c40: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7c60: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
7c70: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
7c80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7c90: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
7ca0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7cc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7cd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7cf0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
7d00: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
7d10: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
7d20: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
7d30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7d40: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
7d50: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
7d60: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
7d70: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
7d80: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
7d90: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7da0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
7db0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
7dc0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
7dd0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
7de0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
7df0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
7e00: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
7e10: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
7e20: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
7e30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
7e50: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
7e60: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
7e70: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
7e80: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
7e90: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
7ea0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
7eb0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
7ec0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
7ed0: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
7ee0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
7ef0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
7f00: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
7f10: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7f20: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
7f30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7f40: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7f60: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
7f70: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
7f80: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
7f90: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
7fa0: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
7fb0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
7fc0: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
7fd0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
7fe0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7ff0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8000: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8010: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8020: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8040: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
8050: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
8060: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
8070: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
8080: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
8090: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
80a0: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
80b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
80c0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
80d0: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
80e0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
80f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8100: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8110: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8120: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8130: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8140: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8150: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8160: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8170: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8180: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8190: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
81a0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
81b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
81c0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
81d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
81e0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
81f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
8200: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
8210: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8220: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8230: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8240: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
8250: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8260: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8270: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8280: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
8290: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
82a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
82b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
82c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
82d0: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
82e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
82f0: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
8300: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
8310: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
8320: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
8330: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
8340: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
8350: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
8360: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
8370: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8380: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8390: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
83a0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
83b0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
83c0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
83d0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
83e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
83f0: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ge->isInit==0 ||
8400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8410: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8420: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8430: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
8440: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
8450: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
8460: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73  pParent;.    ass
8470: 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42  ert( pParent->pB
8480: 74 3d 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t==pPage->pBt );
8490: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
84a0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ent = 0;.    rel
84b0: 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
84c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
84d0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  isInit = 0;.}../
84e0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
84f0: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
8500: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
8510: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
8520: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
8530: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
8540: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
8550: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
8560: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8570: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8580: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
8590: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
85a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
85b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
85c0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
85d0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
85e0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
85f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
8600: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
8610: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
8620: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
8630: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
8640: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  t(DbPage *pData,
8650: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8660: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8670: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
8680: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
8690: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
86a0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
86b0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
86c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
86d0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
86e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
86f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8710: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
8720: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8730: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
8740: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
8750: 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rent);.  }.}../*
8760: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
8770: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
8780: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
8790: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ic int sqlite3Bt
87a0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
87b0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c  dler(void *pArg,
87c0: 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61   int n){.  BtSha
87d0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
87e0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
87f0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
8800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8810: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8820: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
8830: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8840: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
8850: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
8860: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
8870: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
8880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
8890: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
88a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
88b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
88c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
88d0: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
88e0: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
88f0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
8900: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
8910: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
8920: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
8930: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
8940: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
8950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
8960: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
8970: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
8980: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
8990: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
89a0: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
89b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
89c0: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
89d0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
89e0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
89f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8a00: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
8a10: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
8a30: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
8a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
8a60: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
8a70: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
8a80: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
8a90: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8aa0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
8ab0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
8ac0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ae0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
8af0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
8b00: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
8b10: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
8b20: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8b30: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
8b40: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
8b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8b60: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
8b70: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
8b80: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
8b90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
8ba0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
8bb0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
8bc0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
8bd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
8be0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
8bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8c00: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
8c10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
8c20: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
8c30: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
8c40: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
8c50: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
8c60: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
8c70: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
8c80: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
8c90: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
8ca0: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
8cb0: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
8cc0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
8cd0: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
8ce0: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
8cf0: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
8d00: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
8d10: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
8d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8d30: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8d40: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8d50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8d60: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
8d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8d80: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
8d90: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
8da0: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
8db0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
8dc0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
8dd0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
8de0: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
8df0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
8e00: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
8e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8e20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
8e40: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
8e50: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
8e60: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
8e70: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
8e80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8ea0: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
8eb0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
8ec0: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
8ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8ee0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8ef0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
8f00: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
8f10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
8f20: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
8f30: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
8f40: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
8f50: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
8f60: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
8f70: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
8f80: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
8f90: 2a 2f 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  */.  if( (flags 
8fa0: 26 20 42 54 52 45 45 5f 50 52 49 56 41 54 45 29  & BTREE_PRIVATE)
8fb0: 3d 3d 30 0a 20 20 20 26 26 20 69 73 4d 65 6d 64  ==0.   && isMemd
8fc0: 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e  b==0.   && (db->
8fd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
8fe0: 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46  tab)==0.   && zF
8ff0: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
9000: 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20  name[0].  ){.   
9010: 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61 72   if( sqlite3Shar
9020: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
9030: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
9040: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
9050: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
9060: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
9070: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 28 63 68 61  lPathname = (cha
9080: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
9090: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
90a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
90b0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
90c0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
90d0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
90e0: 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
90f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9100: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
9110: 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  che;.      }.   
9120: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
9130: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
9140: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9160: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9180: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
9190: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
91a0: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
91b0: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
91c0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
91d0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ared = sqlite3_m
91e0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
91f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9200: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
9210: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9220: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
9230: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73 71        for(pBt=sq
9240: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
9250: 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d 70  List; pBt; pBt=p
9260: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
9270: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9280: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
9290: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
92a0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
92b0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
92c0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
92d0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
92e0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
92f0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
9300: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
9310: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
9320: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
9330: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
9340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9370: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
9380: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
9390: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
93a0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
93b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
93c0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
93d0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
93e0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
93f0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
9400: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
9410: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
9420: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
9430: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
9440: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
9450: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
9460: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
9470: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
9480: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
94a0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
94b0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
94c0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
94d0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
94e0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
94f0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
9500: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
9510: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
9520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9530: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
9540: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
9550: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
9560: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
9570: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
9580: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
9590: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
95a0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
95b0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
95c0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
95d0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
95e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
95f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
9600: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
9610: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9620: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
9630: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
9640: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9650: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
9660: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
9670: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
9680: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
9690: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
96a0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
96b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
96c0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
96d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
96e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
96f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9700: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9710: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9720: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9730: 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .xFunc = sqlite3
9740: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
9750: 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74 2d  andler;.    pBt-
9760: 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d 20  >busyHdr.pArg = 
9770: 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  pBt;.    rc = sq
9780: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
9790: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
97a0: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
97d0: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
97e0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
97f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9800: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9810: 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
9820: 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
9830: 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
9840: 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
9850: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
9860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9870: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
9880: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
9890: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
98a0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
98b0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
98c0: 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20 70  >busyHdr);.    p
98d0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
98e0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
98f0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
9900: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
9910: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
9920: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
9930: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
9940: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
9950: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
9960: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
9970: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
9980: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
9990: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
99a0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
99b0: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
99c0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
99d0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
99e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
99f0: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
9a00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
9a10: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9a20: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
9a30: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
9a40: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
9a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
9a60: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
9a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
9a80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9a90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9aa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9ab0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9ac0: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
9ad0: 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  25% */.      pBt
9ae0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9af0: 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20   32;   /* 12.5% 
9b00: 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  */.      pBt->mi
9b10: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
9b20: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
9b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9b40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
9b50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
9b60: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
9b70: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
9b80: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9b90: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
9ba0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
9bb0: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
9bc0: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
9bd0: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
9be0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
9bf0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9c00: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
9c10: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
9c20: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
9c30: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9c40: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
9c50: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
9c60: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
9c70: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
9c80: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
9c90: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
9ca0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
9cb0: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
9cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9cd0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
9ce0: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
9cf0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
9d00: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
9d10: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
9d20: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
9d30: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9d40: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9d50: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
9d60: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
9d70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9d80: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9da0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
9db0: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
9dc0: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
9dd0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
9de0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9df0: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
9e00: 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20  eader[22];.     
9e10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9e20: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
9e30: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
9e40: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
9e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
9e70: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
9e80: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
9e90: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
9ea0: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
9eb0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
9ec0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
9ed0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
9ee0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
9ef0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
9f00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
9f10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
9f20: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
9f30: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
9f40: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
9f50: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
9f60: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
9f70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
9f80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9f90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9fa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9fb0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9fd0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9ff0: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
a000: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
a010: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
a020: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
a030: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
a040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a050: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
a060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a070: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
a080: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
a090: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
a0a0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
a0b0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
a0c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
a0d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
a0e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
a0f0: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
a100: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
a110: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
a120: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a130: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
a140: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
a150: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
a160: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a170: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a180: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
a190: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
a1a0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a1b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
a1e0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
a1f0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71   pBt->pNext = sq
a200: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a210: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
a220: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a230: 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  st = pBt;.      
a240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a250: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
a260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a270: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
a280: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a290: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a2a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a2b0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
a2c0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
a2d0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
a2e0: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
a2f0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
a300: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
a310: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
a320: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
a330: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
a340: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
a350: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
a360: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
a370: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
a380: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
a390: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
a3a0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
a3b0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
a3c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a3d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
a3e0: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
a3f0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
a400: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a410: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a420: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
a430: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
a440: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
a450: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
a460: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
a470: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
a480: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a490: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
a4a0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
a4b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a4c0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
a4d0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
a4e0: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
a4f0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
a500: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
a510: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
a520: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a530: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
a540: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
a550: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
a560: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
a570: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
a580: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a590: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
a5c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a5f0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
a600: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
a610: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
a620: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a630: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
a640: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
a650: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
a660: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
a670: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a680: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
a690: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a6a0: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
a6b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a6d0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
a6e0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
a6f0: 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
a700: 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
a710: 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
a720: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
a730: 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
a740: 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
a750: 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
a760: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a770: 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
a780: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
a790: 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
a7a0: 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
a7b0: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
a7c0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
a7d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
a7e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a7f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a800: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a810: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53   *pMaster;.  BtS
a820: 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
a830: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
a840: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a850: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
a860: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a870: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  .  pMaster = sql
a880: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a890: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a8a0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
a8b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a8c0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
a8d0: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
a8e0: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
a8f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
a900: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a910: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
a920: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a930: 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e  heList = pBt->pN
a940: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
a950: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
a960: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a970: 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  List;.      whil
a980: 65 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  e( pList && pLis
a990: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
a9a0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
a9b0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
a9c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a9d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
a9e0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
a9f0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
aa00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
aa10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aa20: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
aa30: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
aa40: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
aa50: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
aa60: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
aa70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
aa80: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
aa90: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
aaa0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
aab0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
aac0: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
aad0: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
aae0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
aaf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ab00: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
ab10: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ab20: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
ab30: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
ab40: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
ab50: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
ab60: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
ab70: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
ab80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ab90: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
aba0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
abb0: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
abc0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75  b = p->db;.  pCu
abd0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
abe0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
abf0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
ac00: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
ac10: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ac20: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ac30: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ac40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ac50: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ac60: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ac70: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ac80: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ac90: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
aca0: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
acb0: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
acc0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
acd0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
ace0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
acf0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ad00: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
ad10: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
ad20: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
ad30: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ad40: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
ad50: 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
ad60: 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
ad70: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
ad80: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
ad90: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
ada0: 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
adb0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
adc0: 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
add0: 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
ade0: 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
adf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
ae00: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
ae10: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
ae20: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
ae30: 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
ae40: 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
ae50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
ae60: 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
ae70: 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
ae80: 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
ae90: 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
aea0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
aeb0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
aec0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
aed0: 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
aee0: 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
aef0: 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
af00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
af10: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
af20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
af30: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
af40: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
af50: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
af60: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
af70: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
af80: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
af90: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
afa0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afb0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
afc0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afd0: 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
afe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
aff0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
b000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b010: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
b020: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b030: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b040: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
b050: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
b060: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
b070: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b080: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
b090: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b0a0: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
b0b0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
b0c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b0e0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
b0f0: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
b100: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
b110: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
b120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b130: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
b140: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
b150: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
b160: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
b170: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
b180: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b190: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
b1a0: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
b1b0: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
b1c0: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
b1d0: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
b1e0: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
b1f0: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
b200: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
b210: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
b220: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
b230: 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
b240: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
b250: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b260: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
b270: 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
b280: 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
b290: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
b2a0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b2b0: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
b2c0: 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
b2d0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
b2e0: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
b2f0: 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
b300: 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
b310: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
b320: 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
b330: 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
b340: 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
b350: 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
b360: 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
b370: 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
b380: 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
b390: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
b3a0: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
b3b0: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
b3c0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
b3d0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
b3e0: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b420: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
b430: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
b440: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
b450: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
b460: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b470: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
b4a0: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
b4b0: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
b4c0: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
b4d0: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
b4e0: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
b4f0: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
b500: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
b510: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
b520: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
b530: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
b540: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
b550: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
b560: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
b570: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
b580: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
b590: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
b5a0: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
b5b0: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
b5c0: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
b5d0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b5e0: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
b5f0: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
b600: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
b610: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
b620: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
b630: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
b640: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
b650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
b660: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
b670: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
b680: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
b690: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
b6a0: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
b6b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b6c0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
b6d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6e0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b6f0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b700: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b710: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
b720: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
b730: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
b740: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
b750: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b760: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b770: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
b780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
b790: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
b7a0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
b7b0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
b7c0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
b7d0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
b7e0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
b7f0: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
b800: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
b810: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
b820: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
b830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
b850: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
b860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b870: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b880: 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
b890: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
b8a0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
b8b0: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
b8c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
b8d0: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
b8e0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
b8f0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b900: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
b910: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b920: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
b930: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
b940: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
b950: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
b960: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
b970: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
b980: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
b990: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
b9a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
b9b0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
b9c0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
b9d0: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
b9e0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
b9f0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
ba00: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
ba10: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
ba20: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
ba30: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
ba40: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
ba50: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
ba60: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
ba70: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
ba80: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
ba90: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
baa0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
bab0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
bac0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
bad0: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
bae0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
baf0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
bb00: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
bb10: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
bb20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
bb30: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
bb40: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
bb50: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
bb60: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
bb70: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
bb80: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
bb90: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
bba0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
bbb0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
bbc0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
bbd0: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
bbe0: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
bbf0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bc00: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
bc10: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
bc20: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bc30: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
bc40: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
bc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bc60: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
bc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
bc80: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
bc90: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
bca0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
bcb0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
bcc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
bcd0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
bce0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
bcf0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
bd00: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
bd10: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
bd20: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
bd30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
bd40: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
bd50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
bd60: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
bd70: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
bd80: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
bd90: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
bda0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bdb0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
bdc0: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
bdd0: 63 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ce = 0;.    rc =
bde0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
bdf0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
be00: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
be10: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
be20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
be30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
be40: 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74  Reserve;.  sqlit
be50: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
be60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
be70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
be80: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
be90: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
bea0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
beb0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
bec0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
bed0: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
bee0: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
bef0: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
bf00: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
bf10: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
bf20: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
bf30: 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
bf40: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
bf50: 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
bf60: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bf70: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bf80: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
bf90: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
bfa0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
bfb0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
bfc0: 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
bfd0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
bfe0: 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
bff0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
c000: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
c010: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
c020: 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
c030: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
c040: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c050: 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
c060: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
c070: 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
c080: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c090: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
c0a0: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
c0b0: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
c0c0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
c0d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c0e0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c0f0: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
c100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c110: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
c120: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
c130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
c140: 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
c150: 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
c160: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
c170: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
c180: 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
c190: 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
c1a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
c1b0: 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
c1c0: 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
c1d0: 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
c1e0: 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
c1f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
c200: 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
c210: 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
c220: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
c230: 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
c240: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
c250: 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
c260: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
c270: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
c280: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
c290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c2a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
c2c0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
c2d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c2e0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
c2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c300: 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56   int av = (autoV
c310: 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73  acuum?1:0);..  s
c320: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c330: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c340: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26  pageSizeFixed &&
c350: 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61   av!=pBt->autoVa
c360: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
c370: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
c380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c390: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c3a0: 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   av;.  }.  sqlit
c3b0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c3c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
c3d0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
c3e0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
c3f0: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
c400: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
c410: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
c420: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
c430: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
c440: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
c450: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
c460: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c470: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
c480: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c490: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
c4a0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
c4b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
c4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c4d0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
c4e0: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
c4f0: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
c500: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
c510: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
c520: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
c530: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
c540: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
c550: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
c560: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
c570: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c580: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c590: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
c5a0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
c5b0: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
c5c0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
c5d0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
c5e0: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
c5f0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
c600: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
c610: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
c620: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
c630: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
c640: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
c650: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
c660: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
c670: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
c680: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
c690: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
c6a0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
c6b0: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
c6c0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
c6d0: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
c6e0: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
c6f0: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
c700: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
c710: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
c720: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
c730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c740: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c760: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c790: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
c7a0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
c7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c7c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c7d0: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
c7e0: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
c7f0: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
c800: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
c810: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
c820: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c830: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c  .  */.  rc = SQL
c840: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66  ITE_NOTADB;.  if
c850: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c860: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
c870: 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ger)>0 ){.    in
c880: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
c890: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
c8a0: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
c8b0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
c8c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
c8d0: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
c8e0: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
c8f0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
c900: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
c910: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
c920: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
c930: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
c940: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c950: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
c960: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c970: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c980: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
c990: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
c9a0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
c9b0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
c9c0: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
c9d0: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
c9e0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
c9f0: 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
ca00: 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
ca10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ca20: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
ca30: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ca40: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ca50: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ca60: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ca70: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
ca80: 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
ca90: 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
caa0: 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
cab0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
cac0: 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
cad0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
cae0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
caf0: 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
cb00: 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
cb10: 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
cb20: 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
cb30: 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
cb40: 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
cb50: 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
cb60: 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
cb70: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
cb80: 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
cb90: 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
cba0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
cbb0: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
cbc0: 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
cbd0: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
cbe0: 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
cbf0: 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
cc00: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
cc10: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
cc20: 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
cc30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cc40: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
cc50: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
cc60: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
cc70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cc80: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
cc90: 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
cca0: 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  pace = 0;.      
ccb0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ccc0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ccd0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
cce0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd00: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
cd10: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
cd20: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cd30: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cd40: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
cd50: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
cd60: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
cd70: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
cd80: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
cd90: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
cda0: 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  21];.    pBt->mi
cdb0: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  nEmbedFrac = pag
cdc0: 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[22];.    pBt-
cdd0: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70  >minLeafFrac = p
cde0: 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65  age1[23];.#ifnde
cdf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ce00: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
ce10: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ce20: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
ce30: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
ce40: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
ce50: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ce60: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
ce70: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
ce80: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
ce90: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
cea0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
ceb0: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
cec0: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
ced0: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
cee0: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
cef0: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
cf00: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
cf10: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
cf20: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
cf30: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
cf40: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
cf50: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
cf60: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
cf70: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
cf80: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
cf90: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
cfa0: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
cfb0: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
cfc0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
cfd0: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
cfe0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
cff0: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
d000: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
d010: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
d020: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
d030: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
d040: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
d050: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
d060: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
d070: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
d080: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
d090: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
d0a0: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
d0b0: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
d0c0: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
d0d0: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
d0e0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
d0f0: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
d100: 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
d110: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
d120: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d130: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
d140: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
d150: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
d160: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
d170: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
d180: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
d190: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
d1a0: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
d1b0: 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
d1c0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
d1d0: 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
d1e0: 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
d1f0: 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
d200: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d210: 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
d220: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
d230: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
d240: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
d250: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
d260: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
d270: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
d280: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
d290: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
d2a0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d2b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
d2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
d2d0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
d2e0: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
d2f0: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
d300: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
d310: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
d320: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
d330: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
d340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
d350: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
d360: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
d370: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d380: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
d390: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d3a0: 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20  utex(pRef) );.  
d3b0: 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e  if( pRef->inTran
d3c0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
d3d0: 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61  .    u8 inTransa
d3e0: 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42  ction = pRef->pB
d3f0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
d400: 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  ;.    btreeInteg
d410: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20  rity(pRef);.    
d420: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d430: 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66  eBeginTrans(pRef
d440: 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e  , 0);.    pRef->
d450: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
d460: 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69  on = inTransacti
d470: 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e  on;.    pRef->in
d480: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
d490: 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  NE;.    if( rc==
d4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4b0: 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54     pRef->pBt->nT
d4c0: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
d4d0: 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74    }.    btreeInt
d4e0: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
d4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d500: 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  .       ../*.** 
d510: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
d520: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
d530: 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
d540: 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
d550: 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
d560: 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
d570: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
d580: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
d590: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
d5a0: 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
d5b0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
d5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
d5d0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
d5e0: 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
d5f0: 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
d600: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d610: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
d620: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20  anding cursors, 
d630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d640: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
d650: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
d660: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
d670: 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
d680: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
d6a0: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
d6b0: 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
d6c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
d6d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d6e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d6f0: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
d700: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
d710: 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73  NE && pBt->pCurs
d720: 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50  or==0 && pBt->pP
d730: 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69  age1!=0 ){.    i
d740: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f( sqlite3PagerR
d750: 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
d760: 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20  ger)>=1 ){.     
d770: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
d780: 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23  age1->aData );.#
d790: 69 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70  if 0.      if( p
d7a0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
d7b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
d7c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
d7d0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
d7e0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61        pPage->aDa
d7f0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
d800: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d810: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
d820: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
d830: 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  Bt;.        pPag
d840: 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  e->pgno = 1;.   
d850: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d860: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
d870: 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
d880: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
d890: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
d8a0: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
d8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d8c0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
d8d0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
d8e0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d8f0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
d900: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
d910: 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
d920: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
d930: 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
d940: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
d950: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
d960: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d970: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
d980: 78 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  x) );.  if( sqli
d990: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
d9a0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30  t(pBt->pPager)>0
d9b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d9c0: 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  _OK;.  pP1 = pBt
d9d0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
d9e0: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
d9f0: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
da00: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
da10: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
da20: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
da30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
da40: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
da50: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
da60: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
da70: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
da80: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
da90: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
daa0: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
dab0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
dac0: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
dad0: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
dae0: 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42  .  data[20] = pB
daf0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
db00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
db10: 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d   data[21] = pBt-
db20: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20  >maxEmbedFrac;. 
db30: 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d   data[22] = pBt-
db40: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20  >minEmbedFrac;. 
db50: 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d   data[23] = pBt-
db60: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20  >minLeafFrac;.  
db70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
db80: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
db90: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
dba0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
dbb0: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
dbc0: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
dbd0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
dc00: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
dc10: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
dc20: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
dc30: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dc40: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
dc50: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dc60: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
dc70: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
dc80: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
dc90: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
dca0: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
dcb0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dcc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
dcd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dce0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
dcf0: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
dd00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
dd10: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
dd20: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
dd30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
dd40: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
dd50: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
dd60: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
dd70: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
dd80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
dd90: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
dda0: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
ddb0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
ddc0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
ddd0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
dde0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
ddf0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
de00: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
de10: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
de20: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
de30: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
de40: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
de50: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
de60: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
de70: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
de80: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
de90: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
dea0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
deb0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
dec0: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
ded0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
dee0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
def0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
df00: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
df10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
df20: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
df30: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
df40: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
df50: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
df60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
df70: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
df80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
df90: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
dfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
dfb0: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
dfc0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dfd0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
dfe0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dff0: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e000: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e010: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e030: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e040: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e050: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e060: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e070: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e080: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e090: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e0a0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e0b0: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e0c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e0d0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e0e0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e0f0: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e100: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e110: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e120: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e130: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e140: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e150: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e160: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e170: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e180: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e190: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e1a0: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e1b0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e1c0: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e1d0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e1e0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e1f0: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e200: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e210: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e220: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
e230: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
e240: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
e250: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
e260: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e270: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
e280: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
e290: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
e2a0: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
e2b0: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
e2c0: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
e2d0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
e2e0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
e2f0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
e300: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
e310: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
e320: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
e330: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
e340: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
e350: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
e360: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
e370: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
e380: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
e390: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
e3a0: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
e3b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e3c0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
e3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
e3e0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e3f0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
e400: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
e410: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
e420: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
e430: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
e440: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e450: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
e460: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
e470: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
e480: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
e490: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
e4a0: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
e4b0: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
e4c0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
e4d0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
e4e0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e4f0: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
e500: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
e510: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e520: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
e530: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
e540: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
e550: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
e560: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
e570: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
e580: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
e590: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e5a0: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
e5b0: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
e5c0: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
e5d0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
e5e0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
e5f0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e600: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
e610: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
e620: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
e630: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
e640: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
e650: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
e660: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
e670: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
e680: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
e690: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
e6a0: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
e6b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
e6c0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e6d0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
e6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e6f0: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
e700: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
e710: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
e720: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
e730: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
e740: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
e750: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
e760: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
e770: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e780: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
e790: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
e7a0: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
e7b0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
e7c0: 64 6f 20 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  do {.    while( 
e7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e7e0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e7f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
e800: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
e810: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
e820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
e830: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
e840: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e860: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e870: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e880: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e890: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
e8a0: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
e8b0: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
e8c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e8d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e8e0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
e8f0: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
e900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e910: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
e920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e930: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
e940: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
e950: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e960: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
e970: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
e980: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
e990: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
e9a0: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
e9b0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
e9c0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
e9d0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
e9e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
e9f0: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
ea00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ea10: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
ea20: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
ea30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
ea40: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
ea50: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
ea60: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
ea70: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
ea80: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
ea90: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
eaa0: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
eab0: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
eac0: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
ead0: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
eae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
eaf0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
eb00: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
eb10: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
eb20: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
eb30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
eb40: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
eb50: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
eb60: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
eb70: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
eb80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
eb90: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
eba0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
ebb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ebc0: 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
ebd0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
ebe0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
ebf0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
ec00: 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
ec10: 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
ec20: 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
ec30: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
ec40: 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
ec50: 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
ec60: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
ec70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
ec80: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
ec90: 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
eca0: 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
ecb0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ece0: 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
ecf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ed20: 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
ed30: 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
ed40: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ed70: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
ed80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ed90: 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72  ;.  int isInitOr
eda0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
edb0: 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
edc0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
edd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ede0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
edf0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ee00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ee10: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ee20: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
ee30: 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ee50: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ee60: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ee70: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
ee80: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
ee90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
eea0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
eeb0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
eec0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
eed0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
eee0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
eef0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ef00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef10: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ef20: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ef30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
ef40: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ef50: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
ef60: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
ef70: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
ef80: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
ef90: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
efa0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
efb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
efc0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
efd0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
efe0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
eff0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f000: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
f010: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f020: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
f030: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
f040: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
f050: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
f060: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
f070: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
f080: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
f090: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
f0a0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
f0b0: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
f0c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f0d0: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
f0e0: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
f0f0: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
f100: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
f110: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
f120: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
f130: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
f140: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
f150: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
f160: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
f170: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
f180: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
f190: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
f1a0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
f1b0: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
f1c0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
f1d0: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
f1e0: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
f1f0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
f200: 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
f230: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
f240: 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
f250: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
f260: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
f270: 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
f280: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
f290: 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
f2a0: 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
f2b0: 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
f2c0: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
f2d0: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
f2e0: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
f2f0: 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
f300: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
f310: 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
f330: 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
f340: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
f350: 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
f360: 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
f370: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
f380: 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
f390: 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
f3a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f3b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f3c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
f3d0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
f3e0: 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
f3f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
f400: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
f410: 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
f420: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
f430: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
f440: 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
f450: 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
f460: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f480: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
f490: 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
f4a0: 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
f4b0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
f4c0: 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
f4d0: 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
f4e0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
f4f0: 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
f500: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
f510: 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
f520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
f530: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f540: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f550: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
f560: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
f570: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
f580: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
f590: 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
f5a0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
f5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f5c0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
f5d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
f5e0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
f5f0: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
f600: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
f610: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
f620: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f630: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
f640: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
f650: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f660: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
f670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
f680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
f690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f6b0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
f6c0: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
f6d0: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
f6e0: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
f6f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f710: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
f720: 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
f730: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
f740: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
f750: 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
f760: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
f770: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
f780: 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
f790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f7a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f7b0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
f7c0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
f7d0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
f7e0: 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
f7f0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
f800: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
f810: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
f820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f830: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
f840: 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
f850: 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
f860: 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
f870: 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
f880: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
f890: 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
f8a0: 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
f8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f8c0: 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
f8d0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
f8f0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
f900: 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
f910: 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
f920: 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
f930: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f940: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
f950: 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
f960: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
f970: 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
f980: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f990: 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
f9a0: 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
f9b0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
f9c0: 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20  eePage          
f9d0: 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
f9e0: 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
f9f0: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50   to */.){.  MemP
fa00: 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
fa10: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
fa20: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
fa30: 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
fa40: 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
fa50: 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
fa60: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
fa70: 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
fa80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
fa90: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
faa0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
fab0: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
fac0: 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
fad0: 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
fae0: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
faf0: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
fb00: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
fb10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fb20: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
fb30: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
fb40: 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
fb50: 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
fb60: 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
fb70: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
fb80: 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
fb90: 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
fba0: 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
fbb0: 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
fbc0: 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
fbd0: 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
fbe0: 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
fbf0: 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
fc00: 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
fc10: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
fc20: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
fc30: 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
fc40: 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
fc50: 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
fc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fc70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fc80: 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
fc90: 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
fca0: 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
fcb0: 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
fcc0: 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
fcd0: 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
fce0: 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
fcf0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
fd00: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
fd10: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
fd20: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
fd30: 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
fd40: 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
fd50: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
fd60: 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
fd70: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
fd80: 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
fd90: 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
fda0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
fdb0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
fdc0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
fdd0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
fde0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
fdf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
fe00: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
fe10: 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
fe20: 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
fe30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
fe40: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
fe50: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
fe60: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
fe70: 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
fe80: 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
fe90: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fea0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
feb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
fed0: 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
fee0: 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
fef0: 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
ff00: 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
ff10: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
ff20: 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
ff30: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
ff40: 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
ff50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ff60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ff70: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ff90: 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
ffa0: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
ffb0: 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
ffc0: 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
ffd0: 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
ffe0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
fff0: 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
10000 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
10010 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
10020 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
10030 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
10040 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
10050 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
10060 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10070 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
10080 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
10090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
100a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
100b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
100c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100d0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
100e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
100f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
10110 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10120 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
10130 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10140 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
10150 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
10160 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
10170 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
10180 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10190 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
101a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
101b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
101c0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
101d0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
101e0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
101f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10200 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
10210 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
10220 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
10230 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
10240 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10250 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10260 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
10270 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
10280 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
10290 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
102a0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
102b0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
102c0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
102d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
102e0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
102f0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
10300 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
10310 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
10320 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
10330 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
10340 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10350 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10360 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
10370 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
10380 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
10390 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
103a0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
103b0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
103c0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
103d0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
103e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
103f0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
10400 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
10410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
10420 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
10430 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
10440 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10450 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10460 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
10470 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
10480 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
10490 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
104a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
104b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
104c0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
104d0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
104e0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
104f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10500 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
10510 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
10520 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
10530 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
10540 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10550 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10560 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
10570 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
10580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10590 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
105a0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
105b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
105d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
105e0 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
105f0 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
10600 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
10610 73 74 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61  stPg = sqlite3Pa
10620 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
10630 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  ->pPager);.  }..
10640 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
10650 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
10660 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
10670 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
10680 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
10690 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
106a0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
106b0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
106c0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
106d0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
106e0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
106f0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c  ( nFreeList==0 |
10700 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20  | nFin==iLastPg 
10710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10720 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10730 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
10740 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
10750 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
10760 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
107a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
107b0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
107c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
107d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
107e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
107f0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
10800 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
10810 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
10820 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10830 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
10840 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
10850 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
10860 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
10870 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
10880 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
10890 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
108a0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
108b0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
108c0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
108d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
108e0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
108f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
10900 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
10910 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
10920 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
10930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10940 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
10950 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
10960 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
10970 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
10980 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
10990 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
109a0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
109b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
109c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
109d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
109e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109f0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10a00 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
10a10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
10a20 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
10a30 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
10a40 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
10a50 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
10a60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
10a70 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
10a80 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
10a90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
10aa0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
10ab0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
10ac0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
10ad0 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
10ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10b20 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72  * If nFin is zer
10b30 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
10b40 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
10b50 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
10b60 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
10b70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
10b80 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
10b90 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
10ba0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
10bb0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
10bc0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e  other hand, if n
10bd0 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74  Fin is greater t
10be0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
10bf0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
10c00 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
10c10 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
10c20 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
10c30 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
10c40 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
10c50 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
10c60 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  */.      do {.  
10c70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
10c80 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10c90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
10ca0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
10cb0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
10cc0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
10cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
10cf0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10d00 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
10d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10d20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
10d30 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
10d40 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  .      }while( n
10d50 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50  Fin!=0 && iFreeP
10d60 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
10d70 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
10d80 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
10d90 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c   .      rc = sql
10da0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
10db0 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29  LastPg->pDbPage)
10dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
10dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10de0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
10df0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
10e00 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
10e10 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
10e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
10e30 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10e40 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
10e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
10e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10e80 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75    }..  pBt->nTru
10e90 6e 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31  nc = iLastPg - 1
10ea0 3b 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e  ;.  while( pBt->
10eb0 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f  nTrunc==PENDING_
10ec0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
10ed0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10ee0 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20  t, pBt->nTrunc) 
10ef0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  ){.    pBt->nTru
10f00 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nc--;.  }.  retu
10f10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10f20 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
10f30 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10f40 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
10f50 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
10f60 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
10f70 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
10f80 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
10f90 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
10fa0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
10fb0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
10fc0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
10fd0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
10fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
10ff0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
11000 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
11010 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
11020 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
11030 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a  rror occured,.**
11040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11050 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11060 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
11070 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
11080 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
11090 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
110a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
110b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
110c0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
110d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
110e0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
110f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11100 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11110 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
11120 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11130 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
11140 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
11150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11160 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
11170 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
11180 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
11190 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
111a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
111b0 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  pBt, 0);.  }.  s
111c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
111d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
111e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
111f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11200 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
11210 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
11220 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11230 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
11240 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
11250 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
11260 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
11270 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
11280 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
11290 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
112a0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
112b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
112c0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
112d0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
112e0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
112f0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
11300 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
11310 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
11320 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
11330 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
11340 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
11350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
11360 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
11370 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
11380 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20  no *pnTrunc){.  
11390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
113a0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
113b0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
113c0 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  r;.#ifndef NDEBU
113d0 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  G.  int nRef = s
113e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
113f0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e  unt(pPager);.#en
11400 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73  dif..  assert( s
11410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11420 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11430 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
11440 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11450 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
11460 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11470 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
11480 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
11490 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20  o nFin = 0;..   
114a0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
114b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ==0 ){.      Pgn
114c0 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50  o nFree;.      P
114d0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
114e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
114f0 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
11500 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f  e;.      Pgno nO
11510 72 69 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rig = sqlite3Pag
11520 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
11530 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  >pPager);..     
11540 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
11550 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29  GE(pBt, nOrig) )
11560 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11580 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
11590 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50      if( nOrig==P
115a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
115b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
115c0 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20   nOrig--;.      
115d0 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
115e0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
115f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11600 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70  );.      nPtrmap
11610 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
11620 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
11630 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
11640 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
11650 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
11660 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
11670 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  ;.      if( nOri
11680 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
11690 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
116a0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
116b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
116c0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
116d0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
116e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
116f0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
11700 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
11710 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11720 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11730 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11740 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
11760 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11770 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20  p(pBt, nFin);.  
11780 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11790 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
117a0 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e       assert(nFin
117b0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75  ==0 || pBt->nTru
117c0 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70  nc==0 || nFin<=p
117d0 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20  Bt->nTrunc);.   
117e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
117f0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  K;.      if( pBt
11800 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
11810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11820 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
11830 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
11840 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
11850 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11860 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
11870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11880 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11890 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
118a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
118b0 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  c = nFin;.      
118c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
118d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
118e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
118f0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
11900 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
11910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11920 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72  _OK ){.    *pnTr
11930 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  unc = pBt->nTrun
11940 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  c;.    pBt->nTru
11950 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  nc = 0;.  }.  as
11960 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
11970 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11980 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
11990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
119a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
119b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
119c0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
119d0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
119e0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
119f0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
11a00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
11a10 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
11a20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
11a30 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
11a40 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
11a50 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
11a60 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
11a70 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
11a80 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
11a90 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
11aa0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11ab0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
11ac0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
11ad0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
11ae0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11af0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
11b00 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
11b10 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
11b20 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
11b30 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
11b40 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
11b50 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11b60 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
11b70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11b80 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
11b90 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
11ba0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
11bb0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
11bc0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
11bd0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
11be0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
11bf0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
11c00 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
11c10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
11c20 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
11c30 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
11c40 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
11c50 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
11c60 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
11c70 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
11c80 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
11c90 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
11ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
11cc0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
11cd0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
11ce0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
11cf0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
11d00 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
11d10 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
11d20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
11d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
11d40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
11d50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
11d60 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11d70 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
11d80 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
11d90 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
11da0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
11db0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
11dc0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
11dd0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
11de0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
11df0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
11e00 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
11e10 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
11e20 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
11e30 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
11e40 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
11e50 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
11e60 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
11e70 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
11e80 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
11e90 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
11ea0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
11eb0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
11ec0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
11ed0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
11ee0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
11ef0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
11f00 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
11f10 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
11f20 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
11f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11f40 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
11f50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
11f60 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
11f70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11f80 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
11f90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
11fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11fb0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
11fc0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
11fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11fe0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
11ff0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12000 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
12010 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26  uumCommit(pBt, &
12020 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20  nTrunc); .      
12030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12050 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12060 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12070 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
12080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
12090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
120a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
120b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
120c0 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b  ter, nTrunc, 0);
120d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
120e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
120f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12100 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
12110 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
12120 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
12130 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12140 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
12150 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12160 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
12170 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
12180 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12190 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
121a0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
121b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
121c0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
121d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
121e0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
121f0 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12200 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
12210 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
12220 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
12230 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
12240 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
12250 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
12260 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
12270 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
12280 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
12290 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
122a0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
122b0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
122c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
122d0 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
122e0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
122f0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
12300 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
12310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12320 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12330 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12350 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12360 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12370 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
12380 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
12390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
123a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
123b0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
123c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
123d0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
123e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
123f0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
12400 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
12410 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12420 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12430 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
12440 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
12450 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
12460 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
12470 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
12480 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
12490 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
124a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
124b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
124c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
124d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
124e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
124f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12500 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12510 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12520 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12530 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12540 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
12550 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
12560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12570 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12580 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
125a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
125b0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
125c0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
125d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
125e0 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
125f0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12600 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
12610 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12620 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12630 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12640 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12650 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12660 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12670 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12680 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12690 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
126a0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
126b0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
126c0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
126d0 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
126e0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
126f0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
12700 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
12710 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12720 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12730 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12740 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12750 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12760 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12770 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12780 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12790 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
127a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
127b0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
127c0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
127d0 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
127e0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
127f0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
12800 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12810 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12820 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12830 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12840 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12850 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12860 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12890 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
128a0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
128b0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
128c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
128d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
128e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
128f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
12900 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12910 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
12920 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
12930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12940 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12950 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12960 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
12970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
129a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
129b0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
129c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
129d0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
129e0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
129f0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
12a00 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
12a10 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
12a20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
12a30 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
12a40 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
12a50 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
12a60 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
12a70 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
12a80 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
12a90 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
12aa0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
12ab0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
12ac0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
12ad0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
12ae0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
12af0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
12b00 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
12b10 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
12b20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
12b30 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
12b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
12b50 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
12b60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12b70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
12b80 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
12b90 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
12ba0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
12bb0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
12bc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
12bd0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
12be0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
12bf0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
12c00 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
12c10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12c20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
12c30 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
12c40 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
12c50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
12c60 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
12c70 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
12c80 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
12c90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
12ca0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
12cb0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
12cc0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
12cd0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
12ce0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
12cf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
12d00 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
12d10 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
12d20 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
12d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12d40 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
12d50 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
12d60 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
12d70 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
12d80 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
12d90 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
12da0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
12db0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
12dc0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
12dd0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
12de0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
12df0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
12e00 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
12e10 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
12e20 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
12e30 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
12e40 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
12e50 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
12e60 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
12e70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
12e80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12e90 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
12ea0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
12eb0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
12ec0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
12ed0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12ee0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
12ef0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
12f00 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
12f10 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
12f20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
12f30 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
12f40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
12f50 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
12f60 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
12f70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12f80 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
12f90 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
12fa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12fb0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
12fc0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
12fd0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
12fe0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
12ff0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13000 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13010 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13020 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13030 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13040 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13050 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13060 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
13070 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
13080 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13090 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
130a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
130b0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
130c0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
130d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
130e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
130f0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13100 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13110 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13120 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13130 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13140 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13150 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13160 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
13170 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
13180 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
13190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
131a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
131b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
131c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
131d0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
131e0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
131f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13200 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13210 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13220 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
13230 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
13240 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
13250 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
13260 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
13270 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
13280 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
13290 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
132a0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
132b0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
132c0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
132d0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
132e0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
132f0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
13300 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
13310 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
13320 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
13330 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
13340 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
13350 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
13360 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
13370 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
13380 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
13390 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
133a0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
133b0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
133c0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
133d0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
133e0 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
133f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13400 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13410 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
13420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13430 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
13440 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
13450 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
13460 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
13470 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13480 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
13490 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
134a0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
134b0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
134c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
134d0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
134e0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
134f0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
13500 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
13510 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
13520 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
13530 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
13540 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
13550 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
13560 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
13570 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
13580 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
13590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
135a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
135b0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
135c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
135d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
135e0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
135f0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13600 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13610 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13620 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13630 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
13640 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13650 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13670 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13680 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
13690 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
136a0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
136b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
136c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
136d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
136e0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
136f0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13700 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
13710 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
13720 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13730 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13740 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13760 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13770 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
13780 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
13790 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
137a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
137b0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
137c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
137d0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
137e0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
137f0 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
13800 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
13810 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
13820 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
13830 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
13840 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
13850 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
13860 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
13870 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
13880 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
13890 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
138a0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
138b0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
138c0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
138d0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
138e0 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
138f0 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
13900 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
13910 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
13920 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
13930 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
13940 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
13950 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
13960 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
13970 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
13980 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
13990 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
139a0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
139b0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
139c0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
139d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
139e0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
139f0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
13a00 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
13a10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
13a20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13a30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
13a40 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
13a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13a60 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
13a70 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a80 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13aa0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13ab0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13ac0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
13ad0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13ae0 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
13af0 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
13b00 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
13b10 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
13b20 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
13b30 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
13b40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13b50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13b60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13b70 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
13b80 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
13b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13ba0 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
13bb0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
13bc0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
13bd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13be0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13bf0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
13c00 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
13c10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
13c30 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
13c40 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c50 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
13c60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
13c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
13c80 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
13c90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
13ca0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13cb0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13cd0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13ce0 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
13cf0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
13d00 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d20 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
13d30 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
13d40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13d50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
13d60 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
13d70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13d80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
13da0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
13db0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13dc0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
13dd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
13de0 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
13df0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13e00 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
13e10 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
13e20 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
13e30 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
13e40 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
13e50 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
13e60 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
13e70 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13e80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
13e90 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
13ea0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
13eb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
13ec0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
13ed0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
13ef0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13f00 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
13f10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13f20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13f30 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
13f40 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
13f50 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
13f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13f70 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
13f80 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
13f90 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
13fa0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
13fb0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
13fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
13fd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13fe0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14000 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14010 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
14020 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
14030 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
14040 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
14050 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
14060 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
14070 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14080 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14090 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
140a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
140b0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
140c0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
140d0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
140e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
140f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
14100 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14110 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
14120 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14130 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14140 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14150 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14160 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14170 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14180 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14190 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
141a0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
141b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
141c0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
141d0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
141e0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
141f0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
14200 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14210 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
14220 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14230 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14240 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14250 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14260 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14270 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14280 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14290 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
142a0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
142b0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
142c0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
142d0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
142e0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
142f0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
14300 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14310 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
14320 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14330 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14340 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14350 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14360 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14370 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14380 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14390 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
143a0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
143b0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
143c0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
143d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
143e0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
143f0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
14400 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14410 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
14420 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
14430 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
14440 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
14450 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14480 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
144b0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
144c0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
144d0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14500 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14510 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14520 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14540 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
14550 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
14560 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14570 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14590 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
145a0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
145b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
145d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
145e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
145f0 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14600 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14610 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14630 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14640 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
14650 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
14660 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
14670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14680 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
14690 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
146a0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
146b0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
146c0 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
146d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
146e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
146f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14700 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14710 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
14720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
14730 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
14740 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
14750 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
14760 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  le;.  if( iTable
14770 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61  ==1 && sqlite3Pa
14780 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14790 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
147a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
147b0 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
147c0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
147d0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
147e0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
147f0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
14800 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
14810 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
14820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14830 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14840 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14850 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14860 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14870 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14880 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14890 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
148a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
148b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
148c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
148d0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
148e0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
148f0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
14900 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14910 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
14920 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
14930 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
14940 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
14950 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
14960 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
14970 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
14980 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
14990 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
149a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
149b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
149c0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
149d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
149e0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
149f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
14a00 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
14a10 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
14a20 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
14a30 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14a40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14a50 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14a60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
14a70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14aa0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
14ae0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
14b20 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
14b30 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
14b70 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
14b80 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
14b90 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14bb0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
14bc0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
14bd0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14c00 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
14c10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14c20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14c30 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
14c40 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
14c50 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
14c60 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
14c70 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
14c80 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14c90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14cc0 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74  sorSize(){.  ret
14cd0 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
14ce0 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  sor);.}..../*.**
14cf0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
14d00 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
14d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14d20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
14d30 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
14d40 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
14d50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14d60 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14d70 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14d80 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
14d90 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
14da0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
14db0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
14dc0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
14dd0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
14de0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
14df0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
14e00 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
14e10 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
14e20 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
14e30 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
14e40 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
14e50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
14e60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
14e70 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
14e80 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
14e90 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
14ea0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14eb0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
14ec0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14ed0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
14ee0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
14ef0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
14f00 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
14f10 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14f20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
14f30 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
14f40 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
14f50 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
14f60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14f70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
14f80 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14f90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
14fa0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
14fb0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
14fc0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
14fd0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
14fe0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
14ff0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
15000 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
15010 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
15020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15030 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
15040 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15050 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
15060 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15070 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15080 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
15090 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
150a0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
150b0 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
150c0 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
150d0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
150e0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
150f0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
15100 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
15110 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
15120 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15130 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15140 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15150 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15160 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15170 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15180 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
151a0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
151b0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
151c0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
151d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
151e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
151f0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
15200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
15210 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
15220 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15240 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15250 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15260 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15270 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15280 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15290 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
152a0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
152b0 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
152c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
152d0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
152e0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
152f0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
15300 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15310 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
15320 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15330 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15350 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15360 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15370 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15380 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15390 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
153a0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
153b0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
153c0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
153d0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
153e0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
153f0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
15400 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
15410 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
15420 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15430 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15440 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15450 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15460 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15470 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15480 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15490 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
154a0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
154b0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
154c0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
154d0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
154e0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
154f0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
15500 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
15510 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
15520 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15530 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15540 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15550 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15560 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
15570 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
15580 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
15590 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
155a0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
155b0 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
155c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
155d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
155e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
155f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
15600 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
15610 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15620 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
15630 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
15640 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15650 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
15660 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
15670 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
15680 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
15690 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
156a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
156b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
156c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
156d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
156e0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
156f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15700 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
15710 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
15720 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
15730 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
15740 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
15750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
15760 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
15770 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
15780 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
15790 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
157a0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
157b0 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
157c0 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
157d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
15810 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15820 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
15860 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15870 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15880 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15890 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c  info);         \
158a0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
158b0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
158f0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
15940 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15980 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
15990 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
159a0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
159b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
159c0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
159d0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
159e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
159f0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
15a00 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
15a10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
15a20 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
15a30 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
15a40 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
15a50 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
15a60 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
15a70 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
15a80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
15a90 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
15aa0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
15ab0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
15ac0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
15ad0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
15ae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15af0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
15b00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15b10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15b20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15b30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15b40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15b50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15b90 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15ba0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15bb0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15bc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15bd0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15be0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15bf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15c00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15c10 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15c20 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15c30 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
15c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c50 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
15c60 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15c70 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
15c80 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
15c90 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
15ca0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
15cb0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
15cc0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
15cd0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
15ce0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
15cf0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
15d00 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
15d10 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
15d20 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
15d30 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
15d40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15d50 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
15d60 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15d70 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
15d80 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
15d90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
15da0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
15db0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15dc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15dd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15de0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15df0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15e00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15e30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15e40 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15e50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15e60 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15e80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15e90 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
15ea0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
15eb0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
15ec0 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
15ed0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
15ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
15ef0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15f00 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
15f10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
15f20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
15f30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15f40 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
15f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
15f60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
15f70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
15f80 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
15f90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
15fa0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
15fb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
15fc0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
15fd0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
15fe0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15ff0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
16000 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
16010 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
16020 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
16030 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
16040 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16050 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16060 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16070 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16080 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16090 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
160a0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
160b0 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
160c0 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
160d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
160e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
160f0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
16100 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
16110 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
16120 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
16130 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
16140 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
16150 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16160 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16170 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16180 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16190 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
161a0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
161b0 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
161c0 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
161d0 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
161e0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
161f0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16200 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16210 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16220 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16230 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16240 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16250 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16260 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16270 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16280 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16290 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
162c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
162d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
162e0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
162f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16300 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16320 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16330 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16340 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16350 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16360 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16370 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16380 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16390 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
163a0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
163b0 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
163c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
163d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
163e0 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
163f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16400 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16410 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16420 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16430 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16440 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16450 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16460 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16470 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16490 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
164a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
164b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
164c0 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
164d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
164e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
164f0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16500 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16510 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16520 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16530 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
16540 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
16550 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
16560 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16570 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
16580 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
16590 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
165a0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
165b0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
165c0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
165d0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
165e0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
165f0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
16600 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
16610 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
16620 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
16630 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16640 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16650 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
16660 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
16670 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
16680 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16690 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
166a0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
166b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
166c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
166d0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
166e0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
166f0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
16700 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
16710 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
16720 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
16730 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
16740 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
16750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16770 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
16780 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16790 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
167a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
167b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
167c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 7d   iGuess;.      }
167d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
167e0 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  f..  if( next==0
167f0 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20 20   || ppPage ){.  
16800 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16810 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = 0;..    rc = 
16820 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16830 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
16840 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b  pPage, next!=0);
16850 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d  .    assert(rc==
16860 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
16870 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ge==0);.    if( 
16880 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53  next==0 && rc==S
16890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168a0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
168b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
168c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
168d0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ppPage ){.      
168e0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
168f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16900 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16910 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
16920 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
16930 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  ext;..  return r
16940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  c;.}../*.** Copy
16950 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
16960 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
16970 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
16980 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
16990 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
169a0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
169b0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
169c0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
169d0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
169e0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
169f0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
16a00 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
16a10 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
16a20 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
16a30 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
16a40 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
16a50 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
16a60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
16a70 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
16a80 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
16a90 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
16aa0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
16ab0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
16ac0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
16ad0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16ae0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
16af0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
16b00 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
16b10 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
16b20 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
16b30 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
16b40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16b50 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
16b60 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
16b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16b80 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
16b90 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16bc0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
16bd0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
16be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
16bf0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
16c00 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
16c10 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
16c20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
16c30 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
16c40 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
16c50 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
16c60 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
16c70 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
16c80 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
16c90 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16ca0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16cb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
16cc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
16cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16cf0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
16d00 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
16d10 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
16d20 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
16d30 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
16d40 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
16d50 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16d60 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
16d70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
16d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16db0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
16dc0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
16dd0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
16de0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
16df0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
16e00 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
16e10 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
16e20 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
16e30 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
16e40 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
16e50 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
16e60 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
16e70 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
16e80 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
16e90 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
16ea0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
16eb0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
16ec0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
16ed0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
16ee0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
16ef0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
16f00 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
16f10 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
16f20 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
16f30 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
16f40 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
16f50 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
16f60 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
16f70 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74  st reads or writ
16f80 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68  es bytes from th
16f90 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20  e payload area. 
16fa0 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20   Data might .** 
16fb0 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
16fc0 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
16fd0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
16fe0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
16ff0 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a   .** pages..**.*
17000 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
17010 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
17020 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
17030 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
17040 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
17050 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
17060 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
17070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
17080 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
17090 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
170a0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
170b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
170c0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
170d0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
170e0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
170f0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
17100 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
17110 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
17120 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
17130 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
17140 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
17150 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17160 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
17170 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
17180 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
17190 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
171a0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
171b0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
171c0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
171d0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
171e0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
171f0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
17200 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
17210 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
17220 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
17230 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
17240 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17250 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
17260 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
17270 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
17280 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
17290 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
172a0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
172b0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
172c0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
172d0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
172e0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
172f0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
17300 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
17310 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
17320 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
17330 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
17340 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
17350 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
17360 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
17370 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
17380 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20  ayload */.  int 
17390 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
173a0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
173b0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
173c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
173d0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
173e0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
173f0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
17400 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20   skipKey,       
17410 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69    /* offset begi
17420 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ns at data if th
17430 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  is is true */.  
17440 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
17450 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
17460 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
17470 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
17480 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17490 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
174a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
174b0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
174c0 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
174d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
174e0 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
174f0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
17500 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
17510 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
17520 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
17530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
17540 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
17550 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
17560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
17570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
17580 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
17590 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
175a0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
175b0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
175c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
175d0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
175e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
175f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17600 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
17610 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
17620 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
17630 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
17640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
17650 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
17660 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
17670 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  : pCur->info.nKe
17680 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
17690 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
176a0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
176b0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
176c0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
176d0 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a  .nData ){.    /*
176e0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
176f0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
17700 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
17710 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
17720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17730 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17740 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
17750 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
17760 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
17770 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
17780 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
17790 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
177a0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
177b0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
177c0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
177d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
177e0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
177f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
17800 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
17810 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
17820 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
17830 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
17840 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
17850 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
17860 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
17870 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
17880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
17890 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
178a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
178b0 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  .  pBt = pCur->p
178c0 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  Bt;.  if( rc==SQ
178d0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
178e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
178f0 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  t ovflSize = pBt
17900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
17910 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
17920 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
17930 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
17940 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
17950 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
17960 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
17970 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
17980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17990 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
179a0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
179b0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
179c0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
179d0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
179e0 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
179f0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
17a00 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
17a10 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
17a20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
17a30 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
17a40 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
17a50 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
17a60 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
17a70 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
17a80 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
17a90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
17aa0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
17ab0 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
17ac0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
17ad0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
17ae0 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
17af0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
17b00 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
17b10 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
17b20 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
17b30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
17b40 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
17b50 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
17b60 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
17b70 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
17b80 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
17b90 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
17ba0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
17bb0 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
17bc0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
17bd0 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
17be0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
17bf0 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
17c00 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70   if( nOvfl && !p
17c10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17c20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17c40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17c50 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
17c60 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17c70 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
17c80 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
17c90 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
17ca0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
17cb0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
17cc0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
17cd0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
17ce0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
17cf0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17d00 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
17d10 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
17d20 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
17d30 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
17d40 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
17d50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
17d60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17d70 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
17d80 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
17d90 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
17da0 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
17db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17dc0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
17dd0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
17de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17df0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17e00 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
17e10 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
17e20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17e30 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
17e40 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
17e50 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
17e60 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
17e70 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
17e80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17e90 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
17ea0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
17eb0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
17ec0 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
17ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
17ee0 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
17ef0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
17f00 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
17f10 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
17f20 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
17f30 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
17f40 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
17f50 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
17f60 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17f70 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
17f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17f90 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17fa0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
17fb0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
17fc0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
17fd0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17fe0 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
17ff0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
18000 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
18010 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
18020 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
18030 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18040 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18050 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
18060 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
18070 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18080 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
18090 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
180a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
180b0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
180c0 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
180d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
180e0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
180f0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
18100 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
18110 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
18120 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
18130 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
18140 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
18150 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
18160 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
18170 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
18180 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
18190 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
181a0 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
181b0 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
181c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
181d0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
181e0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
181f0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
18200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18210 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
18220 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
18230 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18260 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
18270 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
18280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18290 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
182a0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
182b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
182c0 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
182d0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
182e0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
182f0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
18300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18310 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
18320 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
18330 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
18340 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
18350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18360 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
18370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18380 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
18390 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
183a0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
183b0 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
183c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
183d0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
183e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
183f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18400 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18410 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
18420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18430 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
18440 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
18450 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
18460 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
18470 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
18480 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
18490 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
184a0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
184b0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
184c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
184d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
184e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
184f0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18500 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
18510 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18520 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
18530 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
18540 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
18550 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
18560 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
18570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18580 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
18590 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
185a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
185b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
185c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
185d0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
185e0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
185f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18630 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18640 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18650 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
18660 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
18670 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
18680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18690 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
186a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
186b0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
186c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
186d0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
186e0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
186f0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18700 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
18710 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
18720 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
18730 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
18740 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
18750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18760 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18770 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
18780 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18790 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
187a0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
187b0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
187c0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
187d0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
187e0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
187f0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18800 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18810 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18820 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18830 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18840 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18850 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18860 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18870 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18880 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188a0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
188b0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
188c0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
188d0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
188e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
188f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
18900 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
18910 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18920 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18930 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18950 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18960 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18970 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18980 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18990 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
189a0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
189b0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
189c0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
189d0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
189e0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
189f0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18a00 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
18a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a20 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18a30 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
18a40 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
18a50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
18a60 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
18a70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
18a80 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
18a90 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18aa0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
18ab0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
18ac0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
18ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18ae0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
18af0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
18b00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18b10 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
18b20 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
18b30 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
18b40 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
18b50 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
18b60 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
18b70 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
18b80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
18b90 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
18ba0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
18bb0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
18bc0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
18bd0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
18be0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
18bf0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
18c00 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
18c10 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
18c20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
18c30 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
18c40 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
18c50 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
18c60 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
18c70 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
18c80 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
18c90 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
18ca0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
18cb0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
18cc0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
18cd0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79  ed to reassembly
18ce0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
18cf0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
18d00 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
18d10 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
18d20 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
18d30 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
18d40 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
18d50 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
18d60 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
18d70 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
18d80 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
18d90 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
18da0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
18db0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
18dc0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
18dd0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
18de0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
18df0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
18e00 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
18e10 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
18e20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
18e30 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
18e40 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
18e50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
18e60 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
18e70 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
18e80 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
18e90 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
18ea0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
18eb0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
18ec0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
18ed0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
18ee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
18ef0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
18f00 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   int nLocal;..  
18f10 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
18f20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  && pCur->pPage!=
18f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18f40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18f50 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
18f60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18f70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18f80 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
18f90 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
18fa0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18fb0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
18fc0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
18fd0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18fe0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
18ff0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
19000 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
19010 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
19020 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
19030 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
19040 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
19050 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
19060 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
19070 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
19080 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
19090 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
190a0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190b0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
190c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
190d0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190e0 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
190f0 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
19100 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
19110 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
19120 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
19130 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
19140 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
19150 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
19160 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
19170 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
19180 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
19190 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
191a0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
191b0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
191c0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
191d0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
191e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
191f0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
19200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19210 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
19220 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
19230 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
19240 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
19250 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
19260 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
19270 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
19280 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
19290 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
192a0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
192b0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
192c0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
192d0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
192e0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
192f0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
19300 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
19310 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
19320 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
19330 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
19340 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
19350 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19360 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
19370 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
19380 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
19390 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
193a0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
193b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
193c0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
193d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
193e0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
193f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19400 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
19410 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
19420 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
19430 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
19440 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19450 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
19460 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
19470 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
19480 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
19490 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
194a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
194b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
194c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
194d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
194e0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
194f0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19500 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
19510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
19530 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
19540 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
19550 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
19560 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
19570 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
19580 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
19590 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
195a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
195b0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
195c0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
195d0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
195e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
195f0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
19600 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
19610 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19620 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
19630 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19640 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
19650 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19660 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19670 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
19680 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
19690 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
196a0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
196b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
196c0 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
196d0 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
196e0 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
196f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19700 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
19710 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
19720 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
19730 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19740 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
19750 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
19760 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
19770 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
19780 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
19790 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
197a0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
197b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
197c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
197d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
197e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
197f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19800 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19810 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19820 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19830 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19840 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19850 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19860 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19870 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19880 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
19890 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
198a0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
198b0 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
198c0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
198d0 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
198e0 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
198f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19900 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19910 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19920 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19930 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
19940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
19950 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65  RootPage(MemPage
19960 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
19970 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20  age *pParent;.. 
19980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
199a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
199b0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
199c0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
199d0 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
199e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
199f0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31   pParent->pgno>1
19a00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19a10 66 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61  f( get2byte(&pPa
19a20 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
19a30 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  ent->hdrOffset+3
19a40 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
19a50 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19a60 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19a70 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
19a80 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
19a90 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
19aa0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
19ab0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
19ac0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
19ad0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
19ae0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19af0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
19b00 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
19b10 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
19b20 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
19b30 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19b40 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
19b50 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
19b60 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
19b70 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
19b80 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
19b90 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19ba0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19bc0 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
19bd0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
19be0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19bf0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19c00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19c10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19c20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19c30 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19c40 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
19c50 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
19c60 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19c70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19c80 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19c90 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
19ca0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
19cb0 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
19cc0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
19cd0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
19ce0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19cf0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19d00 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19d10 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19d20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19d30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
19d40 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
19d50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19d60 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29  t->idxShift==0 )
19d70 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19d80 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a  idxParent;.}../*
19d90 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19da0 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
19db0 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
19dc0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
19dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19de0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
19df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19e00 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
19e10 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
19e20 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19e30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
19e40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19e50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19e60 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
19e70 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
19e80 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
19e90 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
19ea0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
19eb0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
19ed0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
19ee0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
19ef0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
19f00 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
19f10 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
19f20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19f30 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
19f40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19f50 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
19f60 20 7d 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73   }.    clearCurs
19f70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19f80 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
19f90 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
19fa0 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f  f( pRoot && pRoo
19fb0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
19fc0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61  gnoRoot ){.    a
19fd0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
19fe0 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  Init );.  }else{
19ff0 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
1a000 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1a010 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1a020 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
1a030 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29  oot, &pRoot, 0))
1a040 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1a050 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a060 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1a070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a080 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
1a090 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
1a0a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
1a0b0 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20  e = pRoot;.  }. 
1a0c0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
1a0d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a0e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1a0f0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1a100 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1a110 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  0;.  if( pRoot->
1a120 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
1a130 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
1a140 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
1a150 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1a160 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
1a170 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
1a180 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
1a190 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
1a1a0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
1a1b0 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a  t( subpage>0 );.
1a1c0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1a1d0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
1a1e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1a1f0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
1a200 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  age);.  }.  pCur
1a210 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75  ->eState = ((pCu
1a220 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1a230 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1a240 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1a250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a260 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a270 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1a280 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1a290 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1a2a0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1a2b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1a2c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1a2d0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1a2e0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1a2f0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1a300 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1a310 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1a320 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a330 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a340 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1a350 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1a360 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1a370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a380 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a390 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a3a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a3b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a3c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a3d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1a3e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1a3f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1a400 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a410 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a420 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a430 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a440 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a450 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a460 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a470 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a480 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a490 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a4c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1a4d0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1a4e0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1a4f0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1a500 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1a510 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1a520 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1a530 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1a540 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1a550 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1a560 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1a570 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1a580 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1a590 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1a5a0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1a5b0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1a5c0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1a5d0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1a5e0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1a5f0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1a600 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1a610 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1a620 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1a630 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1a640 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1a650 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a660 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a670 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1a680 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a690 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a6a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a6b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a6c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a6d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a6e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a6f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a700 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a710 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a720 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1a730 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
1a740 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1a750 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1a760 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a770 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a780 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1a790 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
1a7a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a7b0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a7c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1a7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1a7e0 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
1a7f0 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20  ->nCell - 1;.   
1a800 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a810 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1a820 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1a830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a840 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
1a850 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1a860 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a870 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1a880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1a890 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1a8a0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1a8b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1a8c0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1a8d0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1a8e0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1a8f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1a900 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1a910 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
1a920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a930 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1a940 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1a950 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a960 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a970 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a980 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1a990 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1a9a0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1a9b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1a9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a9d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1a9e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a9f0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1aa00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1aa10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1aa20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1aa30 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
1aa40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1aa50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1aa60 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1aa70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1aa80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1aa90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1aaa0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1aab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1aac0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1aad0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1aae0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1aaf0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1ab00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1ab10 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1ab20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1ab30 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1ab40 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1ab50 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1ab60 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1ab70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1ab80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ab90 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1aba0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1abb0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1abc0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1abd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1abe0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1abf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ac00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1ac10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1ac20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1ac30 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ac40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac50 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1ac60 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ac70 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1ac80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1ac90 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1aca0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1acb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1acc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1acd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ace0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1acf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1ad00 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1ad10 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67  t(pCur);.      g
1ad20 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ad30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1ad40 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1ad50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1ad60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ad70 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1ad80 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1ad90 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1ada0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
1adb0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
1adc0 4b 65 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e  Key/nKey/pUnKey.
1add0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1ade0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1adf0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1ae00 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1ae10 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1ae20 2e 20 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  .  pKey .** and 
1ae30 70 55 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e  pUnKey must be N
1ae40 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1ae50 74 61 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70  tables, either p
1ae60 55 6e 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f  UnKey.** must po
1ae70 69 6e 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61  int to a key tha
1ae80 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1ae90 65 6e 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20  en unpacked, or 
1aea0 65 6c 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65  else.** pKey/nKe
1aeb0 79 20 64 65 73 63 72 69 62 65 73 20 61 20 62 6c  y describes a bl
1aec0 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ob containing th
1aed0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e key..**.** If 
1aee0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1aef0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1af00 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1af10 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1af20 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1af30 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1af40 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1af50 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1af60 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1af70 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1af80 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1af90 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1afa0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1afb0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1afc0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1afd0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1afe0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1aff0 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1b000 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1b010 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1b020 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1b030 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1b040 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1b050 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1b060 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1b070 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b080 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b090 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b0a0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1b0b0 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1b0c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1b0d0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1b0e0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1b0f0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1b100 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1b110 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1b120 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1b130 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b140 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b150 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b160 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b170 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1b180 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1b190 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1b1a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b1b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b1c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b1d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b1e0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1b1f0 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  n pKey..**.*/.in
1b200 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1b210 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1b220 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f   *pCur,        /
1b230 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1b240 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f  be moved */.  co
1b250 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b260 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1b270 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69  content for indi
1b280 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62  ces.  Not used b
1b290 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e  y tables */.  Un
1b2a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
1b2b0 6e 4b 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64  nKey,/* Unpacked
1b2c0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79   version of pKey
1b2d0 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2f0 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f  Size of pKey.  O
1b300 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61  r the key for ta
1b310 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  bles */.  int bi
1b320 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1b330 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1b340 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1b350 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1b360 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1b370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
1b380 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a  ch result flag *
1b390 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1b3a0 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30   char aSpace[200
1b3b0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  ];..  assert( cu
1b3c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b3d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b3e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b3f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b400 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1b410 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1b420 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
1b430 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
1b440 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
1b450 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
1b460 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
1b470 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1b480 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
1b490 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
1b4a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b4b0 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
1b4c0 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70  dNKey && pCur->p
1b4d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1b4e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1b4f0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b  fo.nKey==nKey ){
1b500 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1b510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b530 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
1b540 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
1b550 66 6f 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  fo.nKey<nKey ){.
1b560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1b570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b590 20 20 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76    }...  rc = mov
1b5a0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1b5b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1b5c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b5d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b5e0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b5f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73   pCur->pPage->is
1b600 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
1b610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b620 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b630 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1b640 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1b660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1b680 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
1b690 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
1b6a0 20 57 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e   We are given an
1b6b0 20 53 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65   SQL table to se
1b6c0 61 72 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69  arch.  The key i
1b6d0 73 20 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20  s the integer.  
1b6e0 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61    ** rowid conta
1b6f0 69 6e 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70  ined in nKey.  p
1b700 4b 65 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73  Key and pUnKey s
1b710 68 6f 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55  hould both be NU
1b720 4c 4c 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  LL */.    assert
1b730 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20  ( pUnKey==0 );. 
1b740 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d     assert( pKey=
1b750 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
1b760 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20  ( pUnKey==0 ){. 
1b770 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20     /* We are to 
1b780 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e  search an SQL in
1b790 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20  dex using a key 
1b7a0 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f  encoded as a blo
1b7b0 62 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c  b..    ** The bl
1b7c0 6f 62 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70  ob is found at p
1b7d0 4b 65 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20  Key and is nKey 
1b7e0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1b7f0 20 20 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20    Unpack.    ** 
1b800 74 68 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74  this key so that
1b810 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20   we can use it. 
1b820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b830 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55  Key!=0 );.    pU
1b840 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  nKey = sqlite3Vd
1b850 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1b860 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  Cur->pKeyInfo, n
1b870 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1b8a0 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
1b8b0 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
1b8c0 55 6e 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  UnKey==0 ) retur
1b8d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b8f0 57 65 20 61 72 65 20 74 6f 20 73 65 61 72 63 68  We are to search
1b900 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73   an SQL index us
1b910 69 6e 67 20 61 20 6b 65 79 20 74 68 61 74 20 69  ing a key that i
1b920 73 20 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b  s already unpack
1b930 65 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61  ed.    ** and ha
1b940 6e 64 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55  nded to us in pU
1b950 6e 4b 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nKey. */.    ass
1b960 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a  ert( pKey==0 );.
1b970 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b980 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b990 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b9a0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b9b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b9c0 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b9d0 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b9e0 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b9f0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1ba00 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1ba10 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1ba20 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1ba30 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1ba40 79 20 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29  y && pUnKey==0 )
1ba50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ba60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ba70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1ba80 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ba90 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  }.    if( biasRi
1baa0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
1bab0 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20  r->idx = upr;.  
1bac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1bad0 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b  Cur->idx = (upr+
1bae0 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20  lwr)/2;.    }.  
1baf0 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29    if( lwr<=upr )
1bb00 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1bb10 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
1bb20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
1bb30 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ey;.      pCur->
1bb40 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1bb50 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1bb60 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
1bb70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1bb80 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ey ){.        u8
1bb90 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20   *pCell;.       
1bba0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1bbb0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1bbc0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1bbd0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1bbe0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1bbf0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1bc00 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1bc10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1bc20 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1bc30 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ll, &dummy);.   
1bc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1bc50 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1bc60 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
1bc70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1bc80 65 6c 6c 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a  ellKey==nKey ){.
1bc90 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1bca0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1bcb0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79  f( nCellKey<nKey
1bcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1bcd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1bce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
1bcf0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
1bd00 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  nKey );.        
1bd10 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1bd20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1bd30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1bd40 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1bd50 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1bd60 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1bd70 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1bd80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1bd90 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1bda0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1bdb0 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1bdc0 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1bdd0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1bde0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1bdf0 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1be00 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b  ellKey, pUnKey);
1be10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1be20 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
1be30 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ey = sqlite3_mal
1be40 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  loc( nCellKey );
1be50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1be60 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1be70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1be80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1be90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1bea0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1beb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1bed0 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1bee0 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1bef0 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1bf00 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1bf10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1bf20 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1bf30 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29  CellKey, pUnKey)
1bf40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1bf50 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
1bf60 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1bf70 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1bf80 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1bf90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bfa0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1bfb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1bfc0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1bfd0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
1bfe0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1bff0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1c000 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1c010 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1c020 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1c030 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1c040 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c060 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1c070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1c080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c090 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1c0a0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c0c0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1c0d0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70  .        lwr = p
1c0e0 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20  Cur->idx+1;.    
1c0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c100 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   upr = pCur->idx
1c110 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1c120 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
1c130 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1c140 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1c150 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Key;.        bre
1c160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c170 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1c180 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1c190 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1c1a0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1c1b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1c1c0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1c1d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c1e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1c1f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1c200 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1c210 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1c220 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1c230 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c240 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1c250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c260 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1c270 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1c280 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1c290 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1c2a0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1c2b0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c2c0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1c2d0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1c2e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1c2f0 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1c300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c310 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
1c320 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c330 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1c340 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43  dx = lwr;.    pC
1c350 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c360 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1c370 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
1c380 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1c390 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1c3a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1c3b0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c3c0 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
1c3d0 69 73 68 3a 0a 20 20 69 66 28 20 70 4b 65 79 20  ish:.  if( pKey 
1c3e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ){.    /* If we 
1c3f0 63 72 65 61 74 65 64 20 6f 75 72 20 6f 77 6e 20  created our own 
1c400 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 61 74 20  unpacked key at 
1c410 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 0a  the top of this.
1c420 20 20 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65      ** procedure
1c430 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74  , then destroy t
1c440 68 61 74 20 6b 65 79 20 62 65 66 6f 72 65 20 72  hat key before r
1c450 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20  eturning. */.   
1c460 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1c470 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1c480 28 70 55 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  (pUnKey);.  }.  
1c490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c4a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1c4b0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1c4c0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
1c4d0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
1c4e0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
1c4f0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
1c500 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
1c510 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
1c520 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
1c530 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
1c540 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1c550 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
1c560 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
1c570 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
1c580 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
1c590 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
1c5a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1c5b0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1c5c0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
1c5d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
1c5e0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
1c5f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1c600 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1c610 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
1c620 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
1c630 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
1c640 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
1c650 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1c660 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
1c670 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
1c680 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
1c690 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
1c6a0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
1c6b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
1c6c0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
1c6d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c6e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c6f0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
1c700 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c  a cursor..*/.sql
1c710 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72  ite3 *sqlite3Btr
1c720 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74  eeCursorDb(const
1c730 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29   BtCursor *pCur)
1c740 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1c750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c760 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1c770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1c780 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1c790 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->db;.}../*.** A
1c7a0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1c7b0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1c7c0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c7d0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1c7e0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1c7f0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1c800 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1c810 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1c820 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c830 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c840 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c850 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c860 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c870 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1c880 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
1c890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c8a0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c8b0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1c8c0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c8d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c8e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c8f0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c900 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c910 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c940 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1c950 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1c960 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1c970 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1c980 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1c990 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1c9a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c9b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1c9c0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1c9d0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1c9e0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1c9f0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1ca00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ca10 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1ca20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1ca30 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1ca40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1ca50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1ca60 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1ca70 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1ca80 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1ca90 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1caa0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e    if( pCur->idx>
1cab0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1cac0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1cad0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1cae0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1caf0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
1cb00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1cb10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1cb20 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
1cb30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1cb40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1cb50 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1cb60 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1cb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cb80 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
1cb90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cba0 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
1cbb0 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
1cbc0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1cbd0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1cbe0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1cbf0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
1cc00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cc10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1cc20 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1cc30 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1cc40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1cc50 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c  pPage;.    }whil
1cc60 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50  e( pCur->idx>=pP
1cc70 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1cc80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1cc90 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1cca0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63  Data ){.      rc
1ccb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
1ccc0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1ccd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ccf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1cd00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
1cd10 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
1cd20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cd30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cd40 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
1cd50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1cd60 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1cd70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
1cd80 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1cd90 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
1cda0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
1cdb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1cdc0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1cdd0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1cde0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1cdf0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1ce00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1ce10 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1ce20 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1ce30 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1ce40 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1ce50 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1ce60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ce70 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1ce80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1ce90 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1cea0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  c;.  Pgno pgno;.
1ceb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1cec0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ced0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1cee0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1cef0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
1cf00 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1cf10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1cf20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1cf30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
1cf40 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
1cf50 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1cf60 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1cf70 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1cf80 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1cf90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1cfa0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c   if( pCur->skip<
1cfb0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1cfc0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1cfd0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1cfe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cff0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1d000 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
1d010 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1d020 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1d030 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
1d040 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b   pCur->idx>=0 );
1d050 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1d060 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1d070 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64  = get4byte( find
1d080 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1d090 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63  ->idx) );.    rc
1d0a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d0b0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1d0c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d0d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d0e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1d0f0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1d100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1d110 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d  ile( pCur->idx==
1d120 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
1d130 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
1d140 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1d150 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1d160 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1d170 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1d180 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1d190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1d1b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1d1c0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1d1d0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1d1e0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1d1f0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
1d200 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  --;.    pCur->in
1d210 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d220 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1d230 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1d240 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1d250 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1d260 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d270 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1d280 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1d290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d2b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1d2c0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1d2d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1d2e0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d2f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d300 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1d310 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1d320 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1d330 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1d340 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1d350 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1d360 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1d370 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1d380 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1d390 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1d3a0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1d3b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1d3c0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1d3d0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1d3e0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1d3f0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1d400 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1d410 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1d420 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d430 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1d440 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1d450 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1d460 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1d470 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1d480 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1d490 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1d4a0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1d4b0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1d4c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1d4d0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1d4e0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1d4f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1d500 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1d510 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1d520 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1d530 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1d540 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1d550 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1d560 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1d570 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1d580 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1d590 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1d5a0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1d5b0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1d5c0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1d5d0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1d5e0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1d5f0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1d600 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1d610 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1d620 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1d630 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1d640 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1d650 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1d660 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1d670 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1d680 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1d690 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1d6a0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1d6b0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1d6c0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1d6d0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1d6e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1d6f0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1d700 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1d710 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1d720 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1d730 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1d740 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1d750 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1d760 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1d770 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1d780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d790 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1d7a0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1d7b0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1d7c0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1d7d0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1d7e0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1d7f0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1d800 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1d810 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1d820 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d830 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1d840 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
1d850 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1d860 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1d870 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d880 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1d890 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1d8a0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1d8b0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1d8c0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1d8d0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1d8e0 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1d8f0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1d900 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1d910 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1d920 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1d930 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1d940 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1d950 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1d960 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1d970 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1d980 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1d990 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1d9a0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1d9b0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1d9c0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1d9d0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1d9e0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1d9f0 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1da00 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1da10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1da20 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1da30 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
1da40 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
1da50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1da60 65 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20  er) ){.      u8 
1da70 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
1da80 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
1da90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1daa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1dab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
1dac0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
1dad0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
1dae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1daf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1db00 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1db10 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1db20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1db30 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1db40 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
1db50 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
1db60 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
1db70 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
1db80 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
1db90 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
1dba0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
1dbb0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
1dbc0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
1dbd0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
1dbe0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
1dbf0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1dc00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1dc10 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1dc20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1dc30 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
1dc40 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1dc50 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
1dc60 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
1dc70 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
1dc80 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
1dc90 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
1dca0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
1dcb0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
1dcc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
1dcd0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1dce0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
1dcf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
1dd00 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
1dd10 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1dd20 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
1dd30 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1dd40 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
1dd50 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
1dd60 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1dd70 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
1dd80 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
1dd90 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
1dda0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ddb0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1ddc0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1ddd0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
1dde0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
1ddf0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1de00 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
1de10 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1de20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1de30 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1de40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1de50 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1de60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
1de70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1de80 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1de90 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
1dea0 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
1deb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1dec0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
1ded0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
1dee0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
1def0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
1df00 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
1df10 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
1df20 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
1df30 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
1df40 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
1df50 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
1df60 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
1df70 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
1df80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1df90 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1dfa0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1dfb0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1dfc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1dfd0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1dfe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dff0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
1e000 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
1e010 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1e020 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1e030 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1e040 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1e050 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1e060 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1e070 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1e080 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1e090 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1e0a0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1e0b0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
1e0c0 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73  se if( k>pBt->us
1e0d0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1e0e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
1e0f0 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
1e100 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
1e110 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
1e120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e130 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e140 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
1e150 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e160 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1e170 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e180 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
1e190 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
1e1a0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
1e1b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1e1c0 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
1e1d0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
1e1e0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
1e1f0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1e200 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
1e210 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1e220 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
1e230 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
1e240 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e250 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
1e260 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1e270 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1e280 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1e290 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
1e2a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e2b0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1e2c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1e2d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1e2e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e2f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e300 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
1e310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e320 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1e330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e340 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1e350 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1e360 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1e370 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1e380 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
1e390 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
1e3a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1e3b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e3c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1e3d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e3f0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
1e400 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
1e410 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
1e420 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
1e430 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
1e440 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
1e450 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
1e460 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
1e470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
1e480 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1e490 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1e4a0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e4b0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
1e4c0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
1e4d0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1e4e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
1e4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1e500 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1e510 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
1e520 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
1e530 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e550 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1e560 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e570 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1e590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e5a0 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
1e5b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e5c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e5d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e5e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e5f0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1e600 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e610 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e620 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e630 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e640 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1e650 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1e660 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1e670 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e680 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1e690 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1e6a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1e6b0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
1e6c0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e6d0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
1e6e0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1e6f0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1e700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e710 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1e720 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1e730 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e740 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
1e750 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
1e760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1e770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e780 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
1e790 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1e7a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e7c0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1e7d0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1e7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e7f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e800 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1e810 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
1e820 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
1e840 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1e850 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1e860 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1e870 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1e880 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1e890 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
1e8a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8b0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
1e8c0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
1e8d0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  k */.        int
1e8e0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
1e8f0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
1e900 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1e910 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
1e920 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
1e930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e940 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1e950 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1e960 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1e970 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1e980 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1e990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e9a0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
1e9b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1e9c0 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20   i, dist;.      
1e9d0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
1e9e0 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
1e9f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1ea00 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
1ea10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
1ea20 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
1ea30 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1ea40 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
1ea50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1ea60 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
1ea70 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
1ea80 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1ea90 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
1eaa0 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
1eab0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
1eac0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1ead0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
1eae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
1eaf0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
1eb00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eb10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1eb20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
1eb30 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1eb40 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
1eb50 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1eb60 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1eb70 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1eb80 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
1eb90 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
1eba0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1ebb0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
1ebc0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73      if( *pPgno>s
1ebd0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ebe0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1ebf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1ec00 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
1ec10 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1ec20 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
1ec30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ec50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ec60 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ec70 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
1ec80 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
1ec90 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
1ecb0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
1ecc0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ecd0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
1ece0 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
1ecf0 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
1ed00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ed10 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
1ed20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1ed30 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
1ed40 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
1ed50 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
1ed60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ed70 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
1ed80 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1ed90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eda0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1edb0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1edc0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
1edd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ede0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1edf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1ee00 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61  tRollback((*ppPa
1ee10 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1ee20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1ee30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ee40 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1ee50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1ee60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ee70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ee80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ee90 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1eea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eeb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1eec0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1eed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eee0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
1eef0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1ef00 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1ef10 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
1ef20 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
1ef30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ef40 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
1ef50 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1ef60 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
1ef70 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
1ef80 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
1ef90 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a  he file */.    *
1efa0 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50  pPgno = sqlite3P
1efb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1efc0 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a  t->pPager) + 1;.
1efd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1efe0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1eff0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
1f000 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
1f010 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68  An incr-vacuum h
1f020 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77  as already run w
1f030 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
1f040 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20  action. So the. 
1f050 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20       ** page to 
1f060 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20  allocate is not 
1f070 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61  from the physica
1f080 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  l end of the fil
1f090 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  e, but.      ** 
1f0a0 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20  at pBt->nTrunc. 
1f0b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f0c0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54  *pPgno = pBt->nT
1f0d0 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66  runc+1;.      if
1f0e0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
1f0f0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f100 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50   ){.        (*pP
1f110 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  gno)++;.      }.
1f120 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1f130 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
1f140 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1f150 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
1f160 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
1f170 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
1f180 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1f190 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
1f1a0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1f1b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f1c0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
1f1d0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
1f1e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
1f1f0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
1f200 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
1f210 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
1f220 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
1f230 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
1f240 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
1f250 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
1f260 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
1f270 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
1f280 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
1f290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
1f2a0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1f2b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1f2c0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
1f2d0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
1f2e0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
1f2f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
1f300 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
1f310 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1f320 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1f330 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
1f340 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
1f350 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1f360 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1f370 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f380 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f390 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1f3a0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1f3b0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1f3c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f3d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f3e0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1f3f0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1f400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f420 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1f430 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
1f440 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f450 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1f460 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
1f470 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1f480 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1f490 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f4a0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
1f4b0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
1f4c0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1f4d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1f4e0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  evTrunk);.  retu
1f4f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f500 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68  Add a page of th
1f510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f520 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1f530 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  .**.** sqlite3Pa
1f540 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f  gerUnref() is NO
1f550 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61  T called for pPa
1f560 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1f570 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
1f580 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74  ge *pPage){.  Bt
1f590 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f5a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  age->pBt;.  MemP
1f5b0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1f5c0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  t->pPage1;.  int
1f5d0 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a   rc, n, k;..  /*
1f5e0 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67   Prepare the pag
1f5f0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f  e for freeing */
1f600 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1f620 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1f630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f640 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
1f650 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1f660 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
1f670 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  e(pPage->pParent
1f680 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72  );.  pPage->pPar
1f690 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ent = 0;..  /* I
1f6a0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
1f6b0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
1f6c0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
1f6d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f6e0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1f6f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1f700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
1f710 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1f720 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f730 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f740 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b  1->aData[36], n+
1f750 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
1f760 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1f770 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
1f780 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1f790 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
1f7a0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
1f7b0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
1f7c0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
1f7d0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
1f7e0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
1f7f0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
1f800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f810 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1f820 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1f830 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1f840 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1f850 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1f860 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1f870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f880 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f890 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1f8a0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1f8b0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1f8c0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1f8d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1f8e0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1f8f0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1f900 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1f910 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f920 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1f930 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1f940 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1f950 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1f960 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f970 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1f980 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1f990 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1f9a0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1f9b0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1f9c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f9d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f9e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f9f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
1fa00 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1fa10 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
1fa20 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1fa30 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1fa40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
1fa50 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1fa60 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
1fa70 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
1fa80 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
1fa90 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
1faa0 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
1fab0 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
1fac0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
1fad0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1fae0 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
1faf0 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
1fb00 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
1fb10 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
1fb20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1fb30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67  eeGetPage(pBt, g
1fb40 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1fb50 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
1fb60 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
1fb70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1fb80 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
1fb90 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1fba0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
1fbb0 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
1fbc0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1fbd0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
1fbe0 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
1fbf0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
1fc00 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
1fc10 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
1fc20 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
1fc30 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1fc40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fc50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1fc60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fc70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fc80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
1fc90 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
1fca0 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
1fcb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1fcc0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
1fcd0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1fce0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1fcf0 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
1fd00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  no);.        TRA
1fd10 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1fd20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
1fd30 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
1fd40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fd50 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
1fd60 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1fd70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1fd80 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20  e if( k<0 ){.   
1fd90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1fda0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
1fdb0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
1fdc0 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
1fdd0 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
1fde0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
1fdf0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
1fe00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1fe10 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1fe20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1fe30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fe40 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fe50 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1fe60 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
1fe70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1fe80 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
1fe90 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1fea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1feb0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1fec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fed0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
1fee0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
1fef0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
1ff00 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1ff10 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
1ff20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
1ff30 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
1ff40 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1ff50 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
1ff60 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
1ff70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ff80 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
1ff90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1ffa0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ffb0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
1ffc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
1ffd0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
1ffe0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
1fff0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
20000 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20010 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
20020 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
20030 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
20040 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
20050 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
20060 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
20070 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20080 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
20090 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
200a0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
200b0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
200c0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
200d0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
200e0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
200f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
20100 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
20110 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
20120 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
20130 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
20140 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
20150 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20160 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
20170 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
20180 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
20190 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
201a0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
201b0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
201c0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
201d0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
201e0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
201f0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
20200 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
20210 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
20220 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
20230 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
20240 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
20250 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
20260 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
20270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20280 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20290 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f  }..    rc = getO
202a0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
202b0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
202c0 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a  l, (nOvfl==0)?0:
202d0 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20  &ovflPgno);.    
202e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
202f0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65  rc;.    rc = fre
20300 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
20310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20320 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
20330 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
20340 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
20350 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20360 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
20370 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
20380 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
20390 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
203a0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
203b0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
203c0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
203d0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
203e0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
203f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
20400 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
20410 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
20420 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
20430 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
20440 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
20450 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
20460 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
20470 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
20480 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
20490 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
204a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
204b0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
204c0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
204d0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
204e0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
204f0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
20500 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
20510 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
20520 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
20530 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
20540 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
20550 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
20560 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
20570 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
20580 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
20590 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
205a0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
205b0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
205c0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
205d0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
205e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
205f0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
20600 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
20610 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
20620 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
20630 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
20640 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
20650 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
20660 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
20670 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
20680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
20690 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
206a0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
206b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
206c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
206d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
206e0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
206f0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
20700 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
20710 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
20720 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
20730 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
20740 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
20750 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
20760 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
20770 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
20780 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
20790 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
207a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
207b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
207c0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
207d0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
207e0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
207f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20800 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20810 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
20820 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
20830 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
20840 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
20850 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
20860 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
20870 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
20880 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
20890 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
208a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
208b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
208c0 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
208d0 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
208e0 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
208f0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
20900 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
20910 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
20920 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  &nKey);.  sqlite
20930 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
20940 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
20950 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
20960 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
20970 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
20980 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
20990 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
209a0 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e  t( info.nData==n
209b0 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20  Data+nZero );.  
209c0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
209d0 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
209e0 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
209f0 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
20a00 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
20a10 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
20a20 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
20a30 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
20a40 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20a50 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  nPayload += nKey
20a60 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
20a70 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b  y;.    nSrc = nK
20a80 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
20a90 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
20aa0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
20ab0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
20ac0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
20ad0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
20ae0 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
20af0 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
20b00 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
20b10 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
20b20 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eLeft==0 ){.    
20b30 20 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20    int isExact = 
20b40 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
20b50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20b60 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
20b70 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
20b80 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
20b90 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
20ba0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
20bb0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
20bc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
20bd0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
20be0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
20bf0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
20c00 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
20c10 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
20c20 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
20c30 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
20c40 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
20c50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
20c60 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b  f( pgnoOvfl>1 ){
20c70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73  .          /* is
20c80 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20  Exact = 1; */.  
20c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20ca0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
20cb0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
20cc0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
20cd0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
20ce0 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a  Ovfl, isExact);.
20cf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20d00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20d10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
20d20 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
20d30 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
20d40 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
20d50 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
20d60 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
20d70 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
20d80 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
20d90 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
20da0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
20db0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
20dc0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
20dd0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
20de0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
20df0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
20e00 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
20e10 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
20e20 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
20e30 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
20e40 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
20e50 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
20e60 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
20e70 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
20e80 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
20e90 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
20ea0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
20eb0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
20ec0 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
20ed0 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
20ee0 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
20ef0 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
20f00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
20f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20f20 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20f30 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
20f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
20f50 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
20f60 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
20f70 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
20f80 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
20f90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
20fa0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
20fb0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
20fc0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
20fd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
20fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
20ff0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
21000 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21010 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21020 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21030 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
21040 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21060 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
21070 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
21080 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
21090 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
210a0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
210b0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
210c0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
210d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
210e0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
210f0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
21100 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
21110 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
21120 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
21130 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
21140 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
21150 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
21160 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
21170 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  t;.    if( nSrc>
21180 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
21190 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
211a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
211b0 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
211c0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
211d0 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
211e0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
211f0 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
21200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
21210 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
21220 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
21230 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
21240 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
21250 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
21260 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
21270 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
21280 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
21290 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
212a0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
212b0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
212c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
212d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
212e0 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  nge the MemPage.
212f0 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
21300 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73  on the page whos
21310 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67  e number is.** g
21320 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
21330 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74  nd argument so t
21340 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  hat MemPage.pPar
21350 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  ent holds the.**
21360 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
21370 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a  third argument..
21380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
21390 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61  parentPage(BtSha
213a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
213b0 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e  gno, MemPage *pN
213c0 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64  ewParent, int id
213d0 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  x){.  MemPage *p
213e0 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a  This;.  DbPage *
213f0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
21400 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21410 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
21420 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
21430 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b  pNewParent!=0 );
21440 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
21450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21460 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
21470 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
21480 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
21490 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
214a0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
214b0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
214c0 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
214d0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
214e0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
214f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
21500 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
21510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21520 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71  pThis->aData==sq
21530 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
21540 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
21550 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70      if( pThis->p
21560 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65  Parent!=pNewPare
21570 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
21580 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  ( pThis->pParent
21590 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
215a0 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72  nref(pThis->pPar
215b0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
215c0 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50         pThis->pP
215d0 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65  arent = pNewPare
215e0 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  nt;.        sqli
215f0 74 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77  te3PagerRef(pNew
21600 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
21610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21620 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74  pThis->idxParent
21630 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20   = idx;.    }.  
21640 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21650 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
21660 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21670 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21680 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
21690 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
216a0 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
216b0 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  pBt, pgno, PTRMA
216c0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72  P_BTREE, pNewPar
216d0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent->pgno);.  }.
216e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
216f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
21700 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21710 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
21720 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
21730 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69   of pPage to poi
21740 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50  nt back.** to pP
21750 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  age..**.** In ot
21760 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65  her words, for e
21770 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50  very child of pP
21780 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61  age, invoke repa
21790 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f  rentPage().** to
217a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
217b0 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73  each child knows
217c0 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69   that pPage is i
217d0 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  ts parent..**.**
217e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
217f0 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  ts called after 
21800 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65  you memcpy() one
21810 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e   page into.** an
21820 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
21830 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69   int reparentChi
21840 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ldPages(MemPage 
21850 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
21860 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
21870 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
21880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21890 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
218a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
218b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
218c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
218d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65  pPage->leaf ) re
218e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
218f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
21900 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
21910 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
21920 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
21930 2c 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  , i);.    rc = r
21940 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
21950 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
21960 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  , pPage, i);.   
21970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21980 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21990 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72    }.  rc = repar
219a0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
219b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
219c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
219d0 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20  fset+8]), .     
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
219f0 50 61 67 65 2c 20 69 29 3b 0a 20 20 70 50 61 67  Page, i);.  pPag
21a00 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
21a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a20 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
21a30 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
21a40 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
21a50 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
21a60 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
21a70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
21a80 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
21a90 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
21aa0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
21ab0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
21ac0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
21ad0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
21ae0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21af0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
21b00 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
21b10 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
21b20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
21b30 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
21b40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
21b50 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
21b60 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
21b70 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
21b80 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
21b90 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
21ba0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21bb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
21bc0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
21bd0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
21be0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
21bf0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
21c00 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
21c10 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
21c20 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
21c30 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
21c40 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
21c50 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
21c60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
21c70 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
21c80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
21c90 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
21ca0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
21cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21cc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21cd0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21ce0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
21cf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21d00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21d10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
21d20 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
21d30 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
21d40 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
21d50 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
21d60 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
21d70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31  ;.  assert( pc>1
21d80 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67  0 && pc+sz<=pPag
21d90 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
21da0 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63  ze );.  freeSpac
21db0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
21dc0 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  ;.  for(i=idx+1;
21dd0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
21de0 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
21df0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
21e00 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
21e10 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
21e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
21e30 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
21e40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21e50 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
21e60 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
21e70 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65  ee += 2;.  pPage
21e80 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a  ->idxShift = 1;.
21e90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
21ea0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
21eb0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
21ec0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
21ed0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
21ee0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
21ef0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
21f00 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
21f10 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
21f20 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
21f30 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
21f40 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
21f50 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
21f60 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
21f70 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
21f80 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
21f90 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
21fa0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
21fb0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
21fc0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
21fd0 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
21fe0 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
21ff0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
22000 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
22010 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
22020 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
22030 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
22040 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
22050 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
22060 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
22070 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
22080 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
22090 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
220a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
220b0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
220c0 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
220d0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
220e0 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
220f0 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
22100 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
22110 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
22120 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22130 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
22140 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
22150 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
22160 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
22170 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
22180 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
22190 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
221a0 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
221b0 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
221c0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
221d0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
221e0 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
221f0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
22200 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
22210 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
22220 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
22230 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
22240 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
22250 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
22260 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
22270 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
22280 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
22290 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
222a0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
222b0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
222c0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
222d0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
222e0 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53  eeded */.  u8 nS
222f0 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kip          /* 
22300 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  Do not write the
22310 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
22320 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  es of the cell *
22330 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
22340 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
22350 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
22360 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
22370 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
22380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22390 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
223a0 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
223b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
223c0 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
223d0 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
223e0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
223f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
22400 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
22410 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
22420 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
22430 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
22440 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
22450 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
22460 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
22470 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
22480 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
22490 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
224a0 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
224b0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
224c0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
224d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
224e0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
224f0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
22500 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
22510 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
22520 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
22530 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
22540 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
22550 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
22560 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
22570 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
22580 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
22590 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
225a0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
225b0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
225c0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
225d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
225e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
225f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22600 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
22610 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
22620 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
22630 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
22640 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
22650 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
22660 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
22670 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
22680 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
22690 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
226a0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
226b0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
226c0 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f   assert( j<sizeo
226d0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
226e0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
226f0 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70  vfl[0]) );.    p
22700 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
22710 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
22720 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
22730 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70  ].idx = i;.    p
22740 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  Page->nFree = 0;
22750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
22760 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
22770 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
22780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
22790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
227a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
227b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
227c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
227d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
227e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
227f0 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
22800 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64  e->aData;.    hd
22810 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
22820 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20  fset;.    top = 
22830 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
22840 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+5]);.    cell
22850 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
22860 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
22870 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
22880 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
22890 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d  l + 2;.    ins =
228a0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
228b0 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e  i;.    if( end >
228c0 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20   top - sz ){.   
228d0 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
228e0 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
228f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22900 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22910 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  rc;.      top = 
22920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
22930 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
22940 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
22950 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
22960 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
22970 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
22980 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
22990 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
229a0 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
229b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
229c0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
229d0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
229e0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
229f0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
22a00 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
22a10 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
22a20 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
22a30 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
22a40 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
22a50 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
22a60 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
22a70 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
22a80 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
22a90 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
22aa0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
22ab0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
22ac0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
22ad0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
22ae0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
22af0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22b00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22b10 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
22b20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
22b30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
22b40 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
22b50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
22b60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
22b70 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
22b80 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
22b90 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
22ba0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
22bb0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
22bc0 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
22bd0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
22be0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
22bf0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
22c00 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
22c10 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
22c20 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
22c30 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
22c40 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
22c50 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
22c60 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
22c70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
22c80 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
22c90 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
22ca0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
22cb0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
22cc0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
22cd0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
22ce0 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
22cf0 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
22d00 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
22d10 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
22d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
22d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
22d40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
22d50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
22d60 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
22d70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
22d80 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
22d90 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
22da0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
22db0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
22dc0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
22dd0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
22de0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
22df0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
22e00 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
22e10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22e20 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
22e30 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
22e40 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
22e50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22e60 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
22e70 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
22e80 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
22e90 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
22ea0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
22eb0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
22ec0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
22ed0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
22ee0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22f00 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22f10 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
22f20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
22f30 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
22f40 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
22f50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
22f60 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
22f70 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
22f80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
22f90 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
22fa0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
22fb0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
22fc0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
22fd0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
22fe0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
22ff0 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
23000 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
23010 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
23020 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
23030 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23040 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
23050 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f  ->mutex) );.  to
23060 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
23070 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
23080 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
23090 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
230a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
230b0 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
230c0 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
230d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
230e0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
230f0 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
23100 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
23110 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
23120 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
23130 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
23140 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23150 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
23160 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
23170 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
23180 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
23190 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
231a0 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
231b0 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
231c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
231d0 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
231e0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
231f0 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
23200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
23210 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
23220 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
23230 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
23240 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
23250 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
23260 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
23270 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
23280 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
23290 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
232a0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
232b0 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
232c0 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
232d0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
232e0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
232f0 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
23300 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23310 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
23320 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
23330 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
23340 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
23350 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
23360 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
23370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
23380 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
23390 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
233a0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
233b0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
233c0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
233d0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
233e0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
233f0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
23400 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
23410 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
23420 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
23430 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23440 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
23450 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
23460 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
23470 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
23480 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
23490 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
234a0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
234b0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
234c0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
234d0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
234e0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
234f0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
23500 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
23510 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
23520 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
23530 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
23540 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
23550 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
23560 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
23570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23580 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
23590 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
235a0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
235b0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
235c0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
235d0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
235e0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
235f0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
23600 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
23610 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
23620 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
23630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23640 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
23650 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
23660 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
23670 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
23680 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
23690 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
236a0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
236b0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
236c0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
236d0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
236e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
236f0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
23700 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
23710 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
23720 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
23730 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
23740 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
23750 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
23760 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
23770 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
23780 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
23790 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
237a0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
237b0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
237c0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
237d0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
237e0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
237f0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
23800 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
23810 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
23820 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
23830 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
23840 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
23850 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
23860 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
23870 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
23880 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
23890 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
238a0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
238b0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
238c0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
238d0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
238e0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
238f0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
23900 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
23910 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
23920 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
23930 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
23940 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
23950 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23960 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
23970 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
23980 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
23990 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
239a0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50  mPage *pNew;.  P
239b0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
239c0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20  8 *pCell;.  u16 
239d0 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
239e0 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61  fo info;.  BtSha
239f0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
23a00 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
23a10 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
23a20 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
23a30 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
23a40 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
23a50 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
23a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23a70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
23a80 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
23a90 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
23aa0 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
23ab0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
23ac0 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
23ad0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61  der cell */..  a
23ae0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23af0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
23b00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
23b10 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
23b20 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
23b30 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
23b40 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
23b50 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
23b60 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
23b70 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
23b80 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
23b90 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
23ba0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
23bb0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
23bc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23be0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
23bf0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
23c00 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
23c10 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
23c20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
23c30 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
23c40 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
23c50 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
23c60 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
23c70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
23c80 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
23c90 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
23ca0 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
23cb0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
23cc0 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
23cd0 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
23ce0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
23cf0 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
23d00 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
23d10 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50  bPage);..  /* pP
23d20 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
23d30 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
23d40 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
23d50 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
23d60 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
23d70 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
23d80 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
23d90 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
23da0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
23db0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
23dc0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
23dd0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
23de0 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
23df0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
23e00 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
23e10 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
23e20 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
23e30 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
23e40 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
23e50 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
23e60 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
23e70 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
23e80 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28  rentSize);.  if(
23e90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23ea0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
23eb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23ec0 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
23ed0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
23ee0 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
23ef0 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
23f00 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
23f10 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   4);.  if( rc!=S
23f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23f30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23f40 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
23f50 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
23f60 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
23f70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
23f80 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
23f90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
23fa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
23fb0 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65  gnoNew);..#ifnde
23fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23fd0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
23fe0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
23ff0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
24000 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
24010 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69  nter map.  ** wi
24020 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
24030 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
24040 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
24050 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  m the .  ** cell
24060 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
24070 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
24080 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
24090 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
240a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
240b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
240c0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
240d0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
240e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
240f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
24100 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
24110 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d  (pNew, 0);.    }
24120 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24140 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
24150 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24160 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
24170 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ndif..  /* Relea
24180 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
24190 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
241a0 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65   and balance the
241b0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20   parent page,.  
241c0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64  ** in case the d
241d0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
241e0 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
241f0 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
24200 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  l..  */.  releas
24210 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72  ePage(pNew);.  r
24220 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50  eturn balance(pP
24230 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e  arent, 0);.}.#en
24240 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
24250 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
24260 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
24270 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
24280 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50  utes Cells on pP
24290 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e  age and up to NN
242a0 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f  *2 siblings.** o
242b0 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20  f pPage so that 
242c0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
242d0 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d  bout the same am
242e0 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
242f0 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e  ce..** Usually N
24300 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
24310 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
24320 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  ge is used in th
24330 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20  e balancing,.** 
24340 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c  though more sibl
24350 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
24360 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66  from one side if
24370 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69   pPage is the fi
24380 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63  rst.** or last c
24390 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
243a0 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61  nt.  If pPage ha
243b0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e  s fewer than 2*N
243c0 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73  N siblings.** (s
243d0 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
243e0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
243f0 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72  f pPage is the r
24400 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a  oot page or a .*
24410 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29  * child of root)
24420 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
24430 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72  ble siblings par
24440 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
24450 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
24460 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
24470 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
24480 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
24490 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
244a0 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77   by one or.** tw
244b0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
244c0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
244d0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
244e0 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20   over full. The 
244f0 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
24500 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61  special and is a
24510 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61  llowed to be nea
24520 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50  rly empty. If pP
24530 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72  age is .** the r
24540 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
24550 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
24560 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e  tree might be in
24570 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65  creased.** or de
24580 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20  creased by one, 
24590 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f  as necessary, to
245a0 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70   keep the root p
245b0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  age from being.*
245c0 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f  * overfull or co
245d0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
245e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
245f0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
24600 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
24610 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f  e of the Cells o
24620 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  n pPage.** might
24630 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
24640 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
24650 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73  ->aData[].  This
24660 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
24670 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
24680 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66  erfull.  Part of
24690 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   the job of this
246a0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a   routine is to.*
246b0 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * make sure all 
246c0 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20  Cells for pPage 
246d0 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69  once again fit i
246e0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
246f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
24700 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
24710 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ng the siblings 
24720 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61  of pPage, the pa
24730 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a  rent of pPage.**
24740 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76   might become ov
24750 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
24760 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61  ull.  If that ha
24770 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73  ppens, then this
24780 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
24790 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
247a0 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e  y on the parent.
247b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
247c0 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
247d0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
247e0 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
247f0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
24800 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
24810 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
24820 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
24830 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
24840 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
24850 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
24860 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
24870 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  t(MemPage *pPage
24880 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
24890 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
248a0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
248b0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74  of pPage */.  Bt
248c0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
248d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
248e0 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
248f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
24900 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24910 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24920 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
24930 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
24940 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
24950 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
24960 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
24970 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
24980 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
249b0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
249c0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
249f0 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
24a00 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20  */.  int nDiv;  
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24a30 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20  ells in apDiv[] 
24a40 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
24a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a60 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
24a70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  rs */.  int idx;
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
24aa0 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e   pPage in pParen
24ab0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
24ac0 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ae0 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
24af0 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
24b00 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
24b10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24b20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24b30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
24b40 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69  int leafCorrecti
24b50 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
24b60 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
24b70 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
24b80 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
24b90 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
24ba0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
24bb0 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
24bc0 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
24bd0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
24be0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
24bf0 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
24c00 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
24c10 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
24c20 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
24c30 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
24c40 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
24c50 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
24c60 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
24c70 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
24c80 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
24c90 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
24ca0 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20  */.  int iSpace 
24cb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24cc0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
24cd0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
24ce0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
24cf0 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
24d00 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
24d10 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
24d20 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
24d30 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
24d40 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24d50 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
24d60 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
24d70 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
24d80 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
24d90 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
24da0 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
24db0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
24dc0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
24dd0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
24de0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
24df0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
24e00 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
24e10 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
24e20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24e30 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
24e40 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
24e50 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
24e60 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
24e70 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
24e80 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
24e90 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
24ea0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
24eb0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
24ec0 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
24ed0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
24ee0 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
24ef0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
24f00 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
24f10 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
24f20 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
24f30 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
24f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24f50 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
24f60 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
24f70 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
24f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24f90 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
24fa0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
24fb0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
24fc0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  y[NB];          
24fd0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
24fe0 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
24ff0 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
25000 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20  u8 *aSpace;     
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25020 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f  Space to hold co
25030 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
25040 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65   cells */.#ifnde
25050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25060 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61  TOVACUUM.  u8 *a
25070 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
25080 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
25090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
250a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
250b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  ) );..  /* .  **
250c0 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
250d0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
250e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
250f0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
25100 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25110 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25120 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67  pDbPage) || pPag
25130 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
25140 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
25150 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
25160 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
25170 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
25180 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
25190 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
251a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
251b0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
251c0 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
251d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43  n rc;.  }.  TRAC
251e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
251f0 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
25200 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
25210 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
25220 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
25230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
25240 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
25250 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
25260 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
25270 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
25280 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
25290 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
252a0 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
252b0 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
252c0 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
252d0 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
252e0 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
252f0 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
25300 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
25310 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
25320 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
25330 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
25340 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
25350 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
25360 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
25370 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
25380 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
25390 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
253a0 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
253b0 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
253c0 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
253d0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
253e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
253f0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25400 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
25410 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
25420 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25430 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
25440 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
25450 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
25460 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
25470 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
25480 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
25490 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
254a0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
254b0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
254c0 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
254d0 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20    ){.    /*.    
254e0 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  ** TODO: Check t
254f0 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74  he siblings to t
25500 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65  he left of pPage
25510 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74  . It may be that
25520 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
25530 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f   not full and no
25540 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71   new page is req
25550 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
25560 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
25570 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50  _quick(pPage, pP
25580 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  arent);.  }.#end
25590 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  if..  if( SQLITE
255a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
255b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
255c0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  ge->pDbPage)) ){
255d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
255e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
255f0 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
25600 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
25610 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
25620 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
25630 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
25640 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
25650 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
25660 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
25670 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
25680 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
25690 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
256a0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
256b0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
256c0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
256d0 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
256e0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
256f0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
25700 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
25710 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
25720 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
25730 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25740 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
25750 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
25760 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
25770 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
25780 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
25790 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
257a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
257b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
257c0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
257d0 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
257e0 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
257f0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25800 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25810 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
25820 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25830 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
25840 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
25850 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
25860 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
25870 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
25880 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
25890 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
258a0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
258b0 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
258c0 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
258d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
258e0 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
258f0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20  DbPage);..  /*. 
25900 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
25910 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
25920 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
25930 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
25940 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
25950 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
25960 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
25970 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
25980 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
25990 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
259a0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
259b0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
259c0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
259d0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
259e0 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
259f0 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
25a00 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
25a10 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
25a20 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
25a30 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
25a40 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
25a50 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
25a60 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
25a70 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
25a80 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
25a90 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
25aa0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
25ab0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
25ac0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
25ad0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
25ae0 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
25af0 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
25b00 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
25b10 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
25b20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
25b30 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
25b40 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
25b50 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
25b60 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
25b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
25b80 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
25b90 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
25ba0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
25bb0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
25bc0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
25bd0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25be0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
25bf0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
25c00 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
25c10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
25c30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25c40 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
25c50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
25c60 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20  [i], &apOld[i], 
25c70 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
25c80 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
25c90 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
25ca0 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
25cb0 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70  rent = k;.    ap
25cc0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
25cd0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
25ce0 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
25cf0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
25d00 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
25d10 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
25d20 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
25d30 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
25d40 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
25d50 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
25d60 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
25d70 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
25d80 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
25d90 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
25da0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
25db0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
25dc0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
25dd0 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  .  */.  apCell =
25de0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
25df0 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c   .       nMaxCel
25e00 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
25e30 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
25e40 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
25e70 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
25e80 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
25e90 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
25ea0 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
25eb0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
25ec0 65 53 69 7a 65 2a 35 20 20 20 20 20 20 20 20 20  eSize*5         
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ee0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f      /* aSpace */
25ef0 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
25f00 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
25f10 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20  s : 0)          
25f20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
25f30 20 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c    );.  if( apCel
25f40 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
25f50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25f60 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
25f70 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
25f80 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
25f90 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
25fa0 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
25fb0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
25fc0 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
25fd0 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28  ( ((aCopy[0] - (
25fe0 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
25ff0 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
26000 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
26010 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  red */.  for(i=1
26020 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
26030 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
26040 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
26050 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
26060 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
26070 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
26080 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61  Copy[i] - (u8*)a
26090 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
260a0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
260b0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
260c0 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d  /.  }.  aSpace =
260d0 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
260e0 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
260f0 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
26100 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
26110 28 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29  ((aSpace - (u8*)
26120 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
26130 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
26140 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
26150 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
26160 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26170 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
26180 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61  oVacuum ){.    a
26190 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35  From = &aSpace[5
261a0 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  *pBt->pageSize];
261b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
261c0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f   /*.  ** Make co
261d0 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74  pies of the cont
261e0 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64  ent of pPage and
261f0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
26200 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20  to aOld[]..  ** 
26210 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
26220 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
26230 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
26240 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
26250 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
26260 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
26270 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
26280 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
26290 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
262a0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
262b0 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  itten..  */.  fo
262c0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
262d0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
262e0 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20   *p = apCopy[i] 
262f0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70  = (MemPage*)aCop
26300 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  y[i];.    memcpy
26310 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  (p, apOld[i], si
26320 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
26330 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
26340 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  void*)&p[1];.   
26350 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
26360 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
26370 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
26380 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
26390 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
263a0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
263b0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
263c0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
263d0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
263e0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
263f0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
26400 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
26410 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
26420 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
26430 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
26440 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
26450 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
26460 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
26470 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
26480 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
26490 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
264a0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
264b0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
264c0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
264d0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
264e0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
264f0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
26500 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
26510 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
26520 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
26530 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
26540 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
26550 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
26560 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
26570 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
26580 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
26590 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
265a0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
265b0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
265c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
265d0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
265e0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
265f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
26600 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
26610 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
26620 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
26630 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
26640 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
26650 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
26660 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
26670 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
26680 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
26690 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
266a0 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
266b0 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
266c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
266d0 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
266e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
266f0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
26700 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
26710 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
26720 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
26730 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
26740 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
26750 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
26760 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26770 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
26780 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
26790 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
267a0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
267b0 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
267c0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
267d0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
267e0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
267f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26800 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26810 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
26820 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
26830 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
26840 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
26850 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
26860 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
26870 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
26880 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
26890 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
268a0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
268b0 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
268c0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
268d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
268e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
268f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26900 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
26910 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
26920 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
26930 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
26940 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
26950 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
26960 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
26970 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
26980 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
26990 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
269a0 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
269b0 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
269c0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
269d0 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
269e0 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
269f0 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
26a00 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
26a10 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
26a20 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
26a30 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
26a40 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
26a50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
26a60 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
26a70 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
26a80 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
26a90 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
26aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
26ab0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
26ac0 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
26ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ae0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
26af0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26b00 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
26b10 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
26b20 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
26b30 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
26b40 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
26b50 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
26b60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26b70 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
26b80 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
26b90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
26ba0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
26bb0 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
26bc0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
26bd0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
26be0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26bf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
26c00 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
26c10 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26c20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
26c30 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
26c40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26c50 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
26c60 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
26c70 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
26c80 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
26c90 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
26ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
26cb0 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
26cc0 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
26cd0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
26ce0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
26cf0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
26d00 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
26d10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
26d20 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
26d30 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
26d40 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
26d50 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
26d60 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
26d70 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
26d80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26d90 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
26da0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
26db0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
26dc0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
26dd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
26de0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
26df0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
26e00 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
26e10 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
26e20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
26e30 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
26e40 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
26e50 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
26e60 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
26e70 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
26e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26e90 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
26ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26eb0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
26ec0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
26ed0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
26ee0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
26ef0 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
26f00 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
26f10 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
26f20 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
26f30 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
26f40 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
26f50 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
26f60 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
26f70 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
26f80 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
26f90 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
26fa0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
26fb0 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
26fc0 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
26fd0 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
26fe0 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
26ff0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
27000 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
27010 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
27020 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
27030 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
27040 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
27050 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
27060 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
27070 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
27080 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
27090 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
270a0 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
270b0 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
270c0 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
270d0 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
270e0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
270f0 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
27100 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
27110 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
27120 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
27130 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
27140 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
27150 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
27160 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
27170 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
27180 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
27190 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
271a0 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
271b0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
271c0 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
271d0 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
271e0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
271f0 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
27200 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
27210 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
27220 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
27230 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
27240 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
27250 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
27260 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
27270 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
27280 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
27290 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
272a0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
272b0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
272c0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
272d0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
272e0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
272f0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
27300 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
27310 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
27320 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
27330 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
27340 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
27350 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
27360 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
27370 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
27380 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
27390 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
273a0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
273b0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
273c0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
273d0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
273e0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
273f0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
27400 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
27410 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
27420 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
27430 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
27440 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
27450 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
27460 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
27470 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
27480 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
27490 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
274a0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
274b0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
274c0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
274d0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
274e0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
274f0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
27500 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
27510 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
27520 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
27530 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
27540 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
27550 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
27560 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
27570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
27580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27590 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
275a0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
275b0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
275c0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
275d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
275e0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
275f0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
27600 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
27610 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
27620 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
27630 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
27640 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
27650 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
27660 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
27670 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
27680 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
27690 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
276a0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
276b0 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
276c0 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
276d0 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
276e0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
276f0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
27700 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
27710 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
27720 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
27730 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
27740 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
27750 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
27760 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
27770 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
27780 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
27790 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
277a0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
277b0 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65  0])>0) or we are
277c0 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74   the.  ** a virt
277d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
277e0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
277f0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
27800 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
27810 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
27820 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
27830 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
27840 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
27850 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
27860 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
27870 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
27880 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
27890 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
278a0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
278b0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
278c0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
278d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
278e0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
278f0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70  .  pageFlags = p
27900 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  Page->aData[0];.
27910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
27920 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
27930 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
27940 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
27950 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
27960 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
27970 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
27980 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  pgnoOld[i];.    
27990 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
279a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
279b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
279c0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
279d0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
279e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
279f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27a10 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
27a20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
27a30 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
27a40 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
27a50 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
27a60 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
27a70 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27a80 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27a90 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
27aa0 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
27ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f  ;.    }.    zero
27ac0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
27ad0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
27ae0 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
27af0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
27b00 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
27b10 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
27b20 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
27b30 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
27b40 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
27b50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
27b60 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27b70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
27b80 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
27b90 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
27ba0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
27bb0 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
27bc0 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
27bd0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
27be0 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
27bf0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
27c00 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
27c10 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
27c20 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
27c30 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
27c40 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
27c50 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
27c60 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
27c70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
27c80 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
27c90 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
27ca0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
27cb0 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
27cc0 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
27cd0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
27ce0 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
27cf0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
27d00 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
27d10 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
27d20 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
27d30 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
27d40 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
27d50 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
27d60 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
27d70 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
27d80 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
27d90 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
27da0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
27db0 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
27dc0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
27dd0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
27de0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
27df0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
27e00 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
27e10 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
27e20 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
27e30 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
27e40 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
27e50 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
27e60 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
27e70 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
27e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27e90 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
27ea0 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
27eb0 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
27ec0 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
27ed0 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
27ee0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
27ef0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
27f00 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
27f10 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
27f20 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
27f30 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
27f40 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
27f50 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
27f60 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
27f70 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
27f80 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
27f90 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
27fa0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
27fb0 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
27fc0 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
27fd0 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
27fe0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
27ff0 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
28000 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
28010 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
28020 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
28030 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
28040 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
28050 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
28060 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
28070 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
28080 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
28090 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
280a0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
280b0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
280c0 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
280d0 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
280e0 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
280f0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
28100 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
28110 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
28120 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
28130 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
28140 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
28150 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
28160 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
28170 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
28180 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
28190 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
281a0 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
281b0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
281c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
281d0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
281e0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
281f0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28200 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
28210 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
28220 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
28230 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
28240 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
28250 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
28260 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
28270 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
28280 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
28290 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
282a0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
282b0 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66  w==0 );..#ifndef
282c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
282d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
282e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
282f0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
28300 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
28310 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
28320 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
28330 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
28340 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
28350 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
28360 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
28370 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
28380 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
28390 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
283a0 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
283b0 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
283c0 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
283d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
283e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
283f0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
28400 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
28410 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
28420 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
28430 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
28440 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
28450 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
28460 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
28470 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
28480 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28490 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
284a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
284b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
284c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
284d0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
284e0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
284f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28500 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
28510 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
28520 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28530 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
28540 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
28550 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
28560 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
28570 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
28580 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
28590 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
285a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
285b0 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
285c0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
285d0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
285e0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
285f0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
28600 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
28610 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
28620 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
28630 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
28640 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
28650 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
28660 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
28670 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
28680 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
28690 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
286a0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
286b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
286c0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
286d0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
286e0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
286f0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
28700 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
28710 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
28720 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
28730 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
28740 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
28750 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
28760 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
28770 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
28780 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
28790 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
287a0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
287b0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
287c0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
287d0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
287e0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
287f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
28800 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
28810 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
28820 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
28830 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
28840 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
28850 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
28860 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e  ;.        fillIn
28870 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43  Cell(pParent, pC
28880 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
28890 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29  y, 0, 0, 0, &sz)
288a0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
288b0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
288c0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
288d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
288e0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
288f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28900 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
28910 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70   -= 4;.        p
28920 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
28930 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
28940 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
28950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
28960 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
28970 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
28980 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
28990 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
289a0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
289b0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
289c0 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
289d0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
289e0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
289f0 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
28a00 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
28a10 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
28a20 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
28a30 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
28a40 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
28a50 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
28a60 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
28a70 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
28a80 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
28a90 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
28aa0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
28ab0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
28ac0 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
28ad0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
28ae0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
28af0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
28b00 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
28b10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28b20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
28b30 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
28b40 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
28b50 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
28b60 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
28b70 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
28b80 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
28b90 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
28ba0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
28bb0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
28bc0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
28bd0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
28be0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
28bf0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
28c00 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
28c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
28c20 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
28c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
28c40 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
28c50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
28c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28c70 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
28c80 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
28c90 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
28ca0 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
28cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28cc0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
28cd0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28ce0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
28cf0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
28d00 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
28d10 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
28d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28d30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
28d40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
28d50 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
28d60 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
28d70 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
28d80 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
28d90 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
28da0 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
28db0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
28dc0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
28dd0 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
28de0 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
28df0 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
28e00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28e10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28e20 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
28e30 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
28e40 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
28e50 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
28e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28e80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
28e90 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28eb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
28ec0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
28ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
28ee0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
28ef0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
28f00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
28f10 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
28f20 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
28f30 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
28f40 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
28f50 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
28f60 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
28f70 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
28f80 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
28f90 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
28fa0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
28fb0 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
28fc0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
28fd0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
28fe0 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
28ff0 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
29000 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
29010 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
29020 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
29030 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
29040 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
29050 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
29060 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
29070 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
29080 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
29090 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
290a0 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
290b0 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
290c0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
290d0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
290e0 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
290f0 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
29100 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
29110 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
29120 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
29130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
29140 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
29150 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
29160 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
29170 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29180 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
29190 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
291a0 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
291b0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
291c0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
291d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
291e0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
291f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
29200 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
29210 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
29220 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29230 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
29240 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
29250 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
29260 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
29270 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
29280 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
29290 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
292a0 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
292b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
292c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
292d0 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
292e0 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
292f0 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
29300 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
29310 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
29320 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
29330 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
29340 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
29350 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29360 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
29370 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
29380 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
29390 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
293a0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
293b0 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
293c0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
293d0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
293e0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
293f0 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
29400 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
29410 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
29420 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
29430 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
29440 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
29450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
29460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
29470 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
29480 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
29490 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
294a0 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
294b0 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
294c0 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
294d0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
294e0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
294f0 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
29500 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
29510 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
29520 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
29530 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
29540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29550 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
29560 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
29570 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
29580 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
29590 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
295a0 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
295b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
295c0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
295d0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
295e0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
295f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29610 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
29620 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
29630 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
29640 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
29650 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
29660 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
29670 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
29680 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
29690 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
296a0 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
296b0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
296c0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296e0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
296f0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
29700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29710 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
29720 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29730 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
29740 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
29750 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
29760 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29770 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
29780 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
29790 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
297a0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
297b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43  ite3_malloc( mxC
297c0 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
297d0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
297e0 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
297f0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
29800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29810 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
29820 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
29830 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
29840 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
29850 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
29860 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
29870 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
29880 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
29890 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
298a0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
298b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
298c0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
298d0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
298e0 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
298f0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
29900 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
29910 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
29920 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
29930 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
29940 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
29950 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
29960 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
29970 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29980 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
29990 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
299a0 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
299b0 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
299c0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
299d0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
299e0 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
299f0 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
29a00 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
29a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
29a20 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
29a30 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
29a40 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
29a50 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
29a60 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
29a70 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
29a80 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
29a90 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
29aa0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
29ab0 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
29ac0 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
29ad0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
29ae0 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
29af0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
29b00 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
29b10 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
29b20 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
29b30 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
29b40 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
29b50 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
29b60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
29b70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
29b80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
29b90 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
29ba0 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
29bb0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71  t( pgnoChild<=sq
29bc0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
29bd0 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  unt(pPage->pBt->
29be0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
29bf0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29c00 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  GetPage(pPage->p
29c10 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
29c20 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
29c30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
29c40 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
29c50 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
29c60 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
29c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
29c80 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
29c90 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20  ild, pPage);.   
29ca0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29cb0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
29cc0 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
29cd0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
29ce0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
29cf0 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
29d00 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
29d10 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
29d20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
29d30 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
29d40 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
29d50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
29d60 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
29d70 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
29d80 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
29d90 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
29da0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
29db0 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
29dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
29dd0 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
29de0 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
29df0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
29e00 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
29e10 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
29e20 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
29e30 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
29e40 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
29e50 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
29e60 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
29e70 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
29e80 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
29e90 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
29ea0 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
29eb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
29ec0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29ed0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29ee0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
29ef0 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
29f00 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
29f10 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
29f20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28         freePage(
29f30 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
29f40 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29f50 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
29f60 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
29f70 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
29f80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
29fa0 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
29fb0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
29fc0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
29fd0 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
29fe0 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
29ff0 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
2a000 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
2a010 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2a020 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
2a030 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
2a040 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2a050 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a060 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2a070 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
2a080 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
2a090 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
2a0a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
2a0b0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
2a0c0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nit = 0;.      p
2a0d0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
2a0e0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2a0f0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2a100 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
2a110 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2a120 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2a130 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2a140 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
2a150 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
2a160 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
2a170 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
2a190 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
2a1a0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
2a1b0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
2a1c0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67  tChildPages(pPag
2a1d0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
2a1e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a1f0 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
2a200 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2a210 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2a220 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2a230 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2a240 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a250 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2a260 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ){ .        rc =
2a270 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2a280 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
2a290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a2b0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2a2c0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2a2d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a2e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
2a2f0 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2a300 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c  );.  }.end_shall
2a310 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71  ow_balance:.  sq
2a320 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c  lite3_free(apCel
2a330 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2a340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
2a350 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72  oot page is over
2a360 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  full.**.** When 
2a370 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72  this happens, Cr
2a380 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
2a390 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74   page and copy t
2a3a0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
2a3b0 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20  f the root into 
2a3c0 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e  the child.  Then
2a3d0 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a   make the root.*
2a3e0 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20  * page an empty 
2a3f0 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43  page with rightC
2a400 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f  hild pointing to
2a410 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c   the new.** chil
2a420 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61  d.   Finally, ca
2a430 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72  ll balance_inter
2a440 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  nal() on the new
2a450 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75   child.** to cau
2a460 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a  se it to split..
2a470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2a480 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d  lance_deeper(Mem
2a490 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
2a4a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a4b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
2a4c0 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
2a4d0 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
2a4e0 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
2a4f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
2a500 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2a510 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2a520 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ld;     /* Page 
2a530 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2a540 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2a550 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2a560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a570 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75  BTree */.  int u
2a580 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  sableSize;     /
2a590 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73  * Total usable s
2a5a0 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f  ize of a page */
2a5b0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2a5c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2a5d0 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  t of the parent 
2a5e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64  page */.  u8 *cd
2a5f0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
2a600 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2a610 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2a620 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2a630 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2a640 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20   page header in 
2a650 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  parent */.  int 
2a660 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
2a670 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e  /* Offset to con
2a680 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65  tent of first ce
2a690 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  ll in parent */.
2a6a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a6b0 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a  ->pParent==0 );.
2a6c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a6d0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
2a6e0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a6f0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2a700 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a710 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2a720 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2a730 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2a740 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c  Child, &pgnoChil
2a750 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  d, pPage->pgno, 
2a760 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2a770 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
2a780 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2a790 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
2a7a0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
2a7b0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
2a7c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
2a7d0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2a7e0 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
2a7f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2a800 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
2a810 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
2a820 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
2a830 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
2a840 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
2a850 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
2a860 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
2a870 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
2a880 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b  emcpy(&cdata[brk
2a890 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
2a8a0 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a  sableSize-brk);.
2a8b0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2a8c0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
2a8d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2a8e0 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2a8f0 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28  d, pPage);.  if(
2a900 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2a910 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
2a920 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
2a930 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
2a940 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  fl, pPage->nOver
2a950 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
2a960 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  e->aOvfl[0]));. 
2a970 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2a980 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ow = pPage->nOve
2a990 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68  rflow;.  if( pCh
2a9a0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2a9b0 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46  {.    pChild->nF
2a9c0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ree = 0;.  }.  a
2a9d0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2a9e0 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2a9f0 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ll );.  zeroPage
2aa00 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2aa10 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
2aa20 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
2aa30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2aa40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2aa50 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
2aa60 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2aa70 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
2aa80 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
2aa90 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
2aaa0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65  ->pgno));.#ifnde
2aab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2aac0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
2aad0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2aae0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2aaf0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2ab00 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
2ab10 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2ab20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2ab30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ab40 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
2ab50 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ut;.    for(i=0;
2ab60 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
2ab70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
2ab80 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2ab90 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20  (pChild, i);.   
2aba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2abb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2abc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2abd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
2abe0 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  dif.  rc = balan
2abf0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c  ce_nonroot(pChil
2ac00 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70  d);..balancedeep
2ac10 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  er_out:.  releas
2ac20 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2ac30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ac40 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
2ac50 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
2ac60 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
2ac70 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
2ac80 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
2ac90 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
2aca0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
2acb0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
2acc0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
2acd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2ace0 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
2acf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ad00 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  K;.  assert( sql
2ad10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ad20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2ad30 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
2ad40 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  e->pParent==0 ){
2ad50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ad60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2ad70 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2ad80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad90 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2ada0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2adb0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2adc0 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
2add0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2ade0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2adf0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2ae00 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2ae10 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
2ae20 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
2ae30 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2ae40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
2ae50 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
2ae60 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
2ae70 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
2ae80 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
2ae90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2aea0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
2aeb0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
2aec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aed0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2aee0 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2aef0 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2af00 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2af10 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2af20 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2af30 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2af40 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2af50 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2af60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2af70 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2af80 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2af90 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2afa0 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2afb0 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2afc0 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2afd0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2afe0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2aff0 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2b000 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2b010 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2b020 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2b030 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64  ED..**.** In add
2b040 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e  ition to checkin
2b050 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73  g for read-locks
2b060 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c   (where a read-l
2b070 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20  ock .** means a 
2b080 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69  cursor opened wi
2b090 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68  th wrFlag==0) th
2b0a0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
2b0b0 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69  moves.** all wri
2b0c0 74 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68  te cursors so th
2b0d0 61 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  at they are poin
2b0e0 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ting to the .** 
2b0f0 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68  first Cell on th
2b100 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68  e root page.  Th
2b110 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
2b120 62 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72  because an inser
2b130 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20  t .** or delete 
2b140 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
2b150 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2b160 20 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65   on a page or de
2b170 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65  lete.** a page e
2b180 6e 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64  ntirely and we d
2b190 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65  o not want to le
2b1a0 61 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20  ave any cursors 
2b1b0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
2b1c0 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67  non-existant pag
2b1d0 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  es or cells..*/.
2b1e0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2b1f0 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20  ReadLocks(Btree 
2b200 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67  *pBtree, Pgno pg
2b210 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72  noRoot, BtCursor
2b220 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42   *pExclude){.  B
2b230 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
2b240 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
2b250 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
2b260 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
2b270 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
2b280 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2b290 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2b2a0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2b2b0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2b2c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2b2d0 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2b2e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2b2f0 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2b300 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2b310 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2b320 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2b330 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2b340 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2b350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2b360 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2b370 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  p->pBtree->db;. 
2b380 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
2b390 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
2b3a0 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20  (dbOther!=db && 
2b3b0 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
2b3c0 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
2b3d0 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b  ommitted)==0) ){
2b3e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b3f0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2b400 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b410 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70   if( p->pPage->p
2b420 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74  gno!=p->pgnoRoot
2b430 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f   ){.      moveTo
2b440 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Root(p);.    }. 
2b450 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2b460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2b470 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
2b480 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
2b490 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
2b4a0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
2b4b0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
2b4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b4d0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2b4e0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
2b4f0 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
2b500 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
2b510 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
2b520 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 4d  sqlite3_malloc(M
2b530 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2b540 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b550 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2b560 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2b570 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2b580 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2b590 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2b5a0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2b5b0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2b5c0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2b5d0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2b5e0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2b5f0 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2b600 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2b610 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2b620 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2b630 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2b640 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2b650 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2b660 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2b670 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2b680 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2b690 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2b6a0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2b6b0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2b6c0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2b6d0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2b6e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b6f0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2b700 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2b710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b720 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2b730 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2b740 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2b750 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2b760 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2b770 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2b780 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2b790 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2b7a0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2b7b0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2b7c0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2b7d0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2b800 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2b810 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2b820 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2b850 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2b860 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2b870 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2b880 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2b890 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2b8a0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2b8b0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2b8c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2b8d0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2b8e0 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2b8f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2b900 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2b910 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2b920 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2b930 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2b940 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2b950 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2b960 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2b970 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2b980 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2b990 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2b9a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2b9b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2b9c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2b9d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2b9e0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2b9f0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2ba00 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2ba10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ba20 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2ba30 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2ba40 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2ba50 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2ba60 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2ba70 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2ba80 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2ba90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2baa0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2bab0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2bac0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2bad0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
2bae0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2baf0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2bb00 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2bb10 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
2bb20 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2bb30 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2bb40 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2bb50 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2bb60 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2bb70 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2bb80 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2bb90 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2bba0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2bbb0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2bbc0 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2bbd0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2bbe0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2bbf0 75 72 2c 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65  ur, pKey, 0, nKe
2bc00 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
2bc10 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
2bc20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2bc30 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2bc40 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2bc50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
2bc60 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
2bc70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2bc80 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61  f || !pPage->lea
2bc90 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45  fData );.  TRACE
2bca0 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
2bcb0 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
2bcc0 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
2bcd0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
2bce0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2bcf0 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
2bd00 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
2bd10 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
2bd20 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
2bd30 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
2bd40 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2bd50 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
2bd60 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
2bd70 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
2bd80 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
2bd90 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
2bda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bdb0 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
2bdc0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
2bdd0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
2bde0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
2bdf0 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
2be00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2be10 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
2be20 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
2be30 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
2be40 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
2be50 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
2be60 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2be70 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2be80 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2be90 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2bea0 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
2beb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bec0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
2bed0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2bee0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2bef0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2bf00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2bf10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2bf20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
2bf30 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
2bf40 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2bf50 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2bf60 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2bf70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2bf80 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2bf90 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2bfa0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2bfb0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2bfc0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2bfd0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2bfe0 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2bff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c000 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2c010 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2c020 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c030 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2c040 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2c050 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2c060 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c070 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2c080 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2c090 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2c0a0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
2c0b0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
2c0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2c0d0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2c0e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
2c0f0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2c100 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c  Cur->idx, newCel
2c110 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
2c120 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c130 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2c140 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
2c150 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29  alance(pPage, 1)
2c160 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74  ;.  /* sqlite3Bt
2c170 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72  reePageDump(pCur
2c180 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2c190 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20  oRoot, 1); */.  
2c1a0 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  /* fflush(stdout
2c1b0 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ); */.  if( rc==
2c1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c1d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2c1e0 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2c1f0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2c200 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2c210 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2c220 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2c230 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2c240 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2c250 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2c260 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2c270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c280 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2c290 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2c2a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2c2b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2c2c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2c2d0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2c2e0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2c2f0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2c300 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2c310 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2c320 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2c330 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2c340 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2c350 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c360 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2c370 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2c380 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2c390 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2c3a0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2c3b0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2c3c0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2c3d0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2c3e0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2c3f0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2c400 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2c410 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c420 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2c430 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2c440 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2c450 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2c460 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2c470 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2c480 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2c490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c4a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2c4b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2c4c0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2c4d0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2c4e0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2c4f0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2c500 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2c510 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2c520 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2c530 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2c540 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2c550 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2c560 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2c570 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2c580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2c590 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2c5a0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2c5b0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2c5c0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
2c5d0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
2c5e0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2c5f0 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
2c600 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2c610 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
2c620 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2c630 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
2c640 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2c650 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
2c660 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
2c670 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
2c680 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
2c690 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
2c6a0 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
2c6b0 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
2c6c0 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
2c6d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2c6e0 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72   (rc = restoreOr
2c6f0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2c700 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2c710 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2c720 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2c730 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c740 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2c750 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2c760 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c770 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2c780 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c790 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2c7a0 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2c7b0 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65   its page and le
2c7c0 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2c7d0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2c7e0 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2c7f0 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2c800 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2c810 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2c820 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2c830 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2c840 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2c850 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2c860 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2c870 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2c880 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c890 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2c8a0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2c8b0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2c8c0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2c8d0 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2c8e0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2c8f0 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
2c900 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c910 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2c920 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2c930 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2c940 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2c950 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2c960 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2c970 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2c980 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2c990 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2c9a0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2c9b0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2c9c0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2c9d0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2c9e0 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2c9f0 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2ca00 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2ca10 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2ca20 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2ca30 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2ca40 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2ca50 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2ca60 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2ca70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2ca80 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
2ca90 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
2caa0 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
2cab0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
2cac0 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  t( !pPage->leafD
2cad0 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ata );.    sqlit
2cae0 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
2caf0 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
2cb00 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
2cb10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2cb20 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
2cb30 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2cb40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cb50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cb60 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43  PagerWrite(leafC
2cb70 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ur.pPage->pDbPag
2cb80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2cb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cba0 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  ){.      u16 szN
2cbb0 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
2cbc0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2cbd0 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2cbe0 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2cbf0 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2cc00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2cc10 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2cc20 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43  age->pgno, leafC
2cc30 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ur.pPage->pgno))
2cc40 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
2cc50 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2cc60 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2cc70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2cc80 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e       pNext = fin
2cc90 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  dCell(leafCur.pP
2cca0 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2ccb0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2ccc0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65  = cellSizePtr(le
2ccd0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65  afCur.pPage, pNe
2cce0 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xt);.      asser
2ccf0 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
2cd00 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29  pBt)>=szNext+4 )
2cd10 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65  ;.      allocate
2cd20 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
2cd30 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2cd40 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2cd50 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43  .      if( tempC
2cd60 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2cd70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2cd80 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2cd90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cda0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cdb0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2cdc0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2cdd0 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78  , pNext-4, szNex
2cde0 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30  t+4, tempCell, 0
2cdf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ce00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ce10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
2ce20 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2ce30 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2ce40 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2ce50 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72  hild);.        r
2ce60 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2ce70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
2ce80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ce90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cea0 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43    dropCell(leafC
2ceb0 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2cec0 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a  r.idx, szNext);.
2ced0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
2cee0 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61  ance(leafCur.pPa
2cef0 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ge, 0);.      }.
2cf00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2cf10 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
2cf20 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2cf30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2cf40 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2cf50 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2cf60 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2cf70 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2cf80 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2cf90 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2cfa0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2cfb0 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2cfc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2cfd0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2cfe0 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2cff0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2d000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2d010 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2d020 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2d040 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
2d050 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
2d060 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
2d070 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2d080 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2d090 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
2d0a0 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
2d0b0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
2d0c0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
2d0d0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
2d0e0 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
2d0f0 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
2d100 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
2d110 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
2d120 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
2d130 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
2d140 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
2d150 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
2d160 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
2d170 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
2d180 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
2d190 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
2d1a0 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
2d1b0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
2d1c0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
2d1d0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2d1e0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2d1f0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2d200 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2d210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d220 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
2d230 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
2d240 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
2d250 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2d260 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2d270 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2d280 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2d290 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2d2a0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2d2b0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2d2c0 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a  nsaction first *
2d2d0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2d2e0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2d2f0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2d300 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2d310 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2d320 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2d330 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
2d340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d350 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
2d360 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d370 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2d380 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2d390 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2d3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d3b0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
2d3c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2d3d0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
2d3e0 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
2d3f0 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
2d400 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2d410 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
2d420 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
2d430 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
2d440 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
2d450 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
2d460 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
2d470 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
2d480 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
2d490 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
2d4a0 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
2d4b0 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
2d4c0 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
2d4d0 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
2d4e0 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
2d4f0 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
2d500 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
2d510 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
2d520 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
2d530 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
2d540 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
2d550 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
2d560 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
2d570 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
2d580 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
2d590 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
2d5a0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
2d5b0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
2d5c0 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
2d5d0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2d5e0 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
2d5f0 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
2d600 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2d610 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2d620 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
2d630 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
2d640 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
2d650 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d660 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2d670 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
2d680 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d6a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d6b0 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b   }.    pgnoRoot+
2d6c0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
2d6d0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
2d6e0 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
2d6f0 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
2d700 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
2d710 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2d720 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
2d730 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f  .    while( pgno
2d740 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Root==PTRMAP_PAG
2d750 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  ENO(pBt, pgnoRoo
2d760 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
2d770 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
2d780 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2d790 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
2d7a0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
2d7b0 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
2d7c0 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
2d7d0 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
2d7e0 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
2d7f0 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
2d800 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
2d810 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
2d820 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2d830 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
2d840 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2d850 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
2d860 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
2d870 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
2d880 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d890 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d8a0 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d  PageMove, &pgnoM
2d8b0 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31  ove, pgnoRoot, 1
2d8c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d8d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d8e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d8f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   }..    if( pgno
2d900 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Move!=pgnoRoot )
2d910 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52  {.      /* pgnoR
2d920 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20  oot is the page 
2d930 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
2d940 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
2d950 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  age of.      ** 
2d960 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61  the new table (a
2d970 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72  ssuming an error
2d980 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e   did not occur).
2d990 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20   But we were.   
2d9a0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
2d9b0 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71  pgnoMove. If req
2d9c0 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69  uired (i.e. if i
2d9d0 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  t was not alloca
2d9e0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ted.      ** by 
2d9f0 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69  extending the fi
2da00 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74  le), the current
2da10 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f   page at positio
2da20 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20  n pgnoMove.     
2da30 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a   ** is already j
2da40 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20  ournaled..      
2da50 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  */.      u8 eTyp
2da60 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
2da70 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
2da80 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2da90 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Move);..      /*
2daa0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63   Move the page c
2dab0 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f  urrently at pgno
2dac0 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65  Root to pgnoMove
2dad0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2dae0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2daf0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2db00 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
2db10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2db20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2db30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2db40 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2db50 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
2db60 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
2db70 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
2db80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2db90 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50  E_OK || eType==P
2dba0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
2dbb0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2dbc0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2dbd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dbe0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2dbf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2dc00 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2dc10 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
2dc20 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20  OOTPAGE );.     
2dc30 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2dc40 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2dc50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2dc60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dc70 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2dc80 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2dc90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dca0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dcb0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2dcc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2dcd0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65   }.      rc = re
2dce0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2dcf0 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
2dd00 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
2dd10 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2dd20 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
2dd30 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
2dd40 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
2dd50 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
2dd60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dd70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2dd80 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2dd90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dda0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ddb0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2ddc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ddd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dde0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ddf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2de00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2de10 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
2de20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2de30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2de40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2de50 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2de60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2de70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2de80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
2de90 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
2dea0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
2deb0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2dec0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
2ded0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
2dee0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2def0 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
2df00 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2df10 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
2df20 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
2df30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2df40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2df50 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2df60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2df70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2df80 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
2df90 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
2dfa0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2dfb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2dfc0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2dfd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
2dfe0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2dff0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2e000 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2e010 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2e020 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2e030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2e040 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
2e050 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e060 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
2e070 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
2e080 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
2e090 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
2e0a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2e0b0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2e0c0 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
2e0d0 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
2e0e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e0f0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e100 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2e110 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
2e120 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
2e130 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2e140 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2e150 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
2e160 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
2e170 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
2e180 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
2e190 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
2e1a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2e1b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e1c0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2e1d0 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2e1e0 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2e1f0 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2e200 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2e210 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2e220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2e230 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2e240 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2e250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e260 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2e270 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2e280 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2e290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e2a0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2e2b0 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2e2c0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2e2d0 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2e2e0 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2e2f0 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2e300 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2e310 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2e320 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2e330 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2e340 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2e350 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e360 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2e370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e380 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2e390 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2e3a0 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67   pgno>sqlite3Pag
2e3b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
2e3c0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2e3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e3e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2e3f0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2e400 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2e410 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2e420 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2e430 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2e440 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2e450 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2e460 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2e470 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2e480 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2e490 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e4a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2e4b0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2e4c0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2e4d0 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2e4e0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2e4f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e500 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e510 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2e520 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2e530 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2e540 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e550 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2e560 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2e570 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e580 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2e590 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2e5a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e5b0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2e5c0 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2e5d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2e5e0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2e5f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2e600 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2e610 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2e620 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e630 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2e640 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e650 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2e660 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
2e670 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
2e680 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
2e690 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
2e6a0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e6b0 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2e6c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2e6d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e6e0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
2e6f0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
2e700 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2e710 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
2e720 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
2e730 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2e740 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2e750 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
2e760 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2e770 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
2e780 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
2e790 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
2e7a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e7b0 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2e7c0 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2e7d0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2e7e0 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
2e7f0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2e800 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
2e810 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
2e820 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
2e830 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2e840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2e850 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
2e860 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2e870 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
2e880 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e890 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
2e8a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2e8b0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
2e8c0 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
2e8d0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2e8e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
2e8f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2e900 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2e910 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2e920 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63  else if( (rc = c
2e930 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
2e940 20 69 54 61 62 6c 65 2c 20 30 29 29 21 3d 53 51   iTable, 0))!=SQ
2e950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2e960 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
2e970 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
2e980 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2e990 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2e9a0 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2e9b0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
2e9c0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2e9d0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
2e9e0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2e9f0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2ea00 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
2ea10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2ea20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2ea30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2ea40 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2ea50 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2ea60 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2ea70 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2ea80 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2ea90 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2eaa0 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2eab0 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2eac0 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2ead0 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2eae0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2eaf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2eb00 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2eb10 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2eb20 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2eb30 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2eb40 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2eb50 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2eb60 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2eb70 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2eb80 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2eb90 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2eba0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2ebb0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2ebc0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2ebd0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2ebe0 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2ebf0 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2ec00 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2ec10 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2ec20 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2ec30 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2ec40 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2ec50 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2ec60 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2ec70 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2ec80 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2ec90 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2eca0 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2ecb0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2ecc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ecd0 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2ece0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2ecf0 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2ed00 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2ed10 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2ed20 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2ed30 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2ed40 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2ed50 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2ed60 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2ed70 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2ed80 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2ed90 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2eda0 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2edb0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2edc0 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2edd0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2ede0 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
2edf0 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
2ee00 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
2ee10 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
2ee20 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2ee30 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2ee40 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2ee50 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2ee60 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
2ee70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2ee80 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2ee90 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2eea0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2eeb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2eec0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2eed0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2eee0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2eef0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2ef00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2ef10 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
2ef20 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
2ef30 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
2ef40 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
2ef50 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
2ef60 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2ef70 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2ef80 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
2ef90 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
2efa0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
2efb0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
2efc0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
2efd0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
2efe0 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
2eff0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
2f000 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
2f010 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
2f020 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
2f030 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
2f040 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
2f050 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2f060 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
2f070 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2f080 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2f090 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
2f0a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2f0b0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
2f0c0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2f0d0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29  Table(p, iTable)
2f0e0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2f0f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2f100 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2f110 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
2f120 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
2f130 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
2f140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f150 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
2f160 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2f170 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
2f180 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
2f190 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
2f1a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2f1b0 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
2f1c0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
2f1d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f1e0 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
2f1f0 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
2f200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f210 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2f220 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2f230 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f240 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2f250 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
2f260 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
2f270 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f280 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2f290 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
2f2a0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2f2b0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2f2c0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2f2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
2f2e0 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
2f2f0 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
2f300 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
2f310 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f320 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f330 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f340 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2f350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f380 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2f390 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2f3a0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
2f3b0 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
2f3c0 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
2f3d0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2f3e0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2f3f0 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
2f400 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
2f410 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
2f420 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
2f430 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2f440 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
2f450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f460 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
2f470 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2f480 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2f490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f4a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2f4b0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2f4c0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2f4d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f4f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f510 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
2f520 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
2f530 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2f540 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  0, iTable);.    
2f550 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f560 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2f570 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f5a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2f5b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f5c0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2f5d0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2f5e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f600 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f610 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2f620 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f630 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2f640 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f650 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2f660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
2f6a0 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
2f6b0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
2f6c0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
2f6d0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
2f6e0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
2f6f0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
2f700 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
2f710 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
2f720 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
2f730 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
2f740 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
2f750 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
2f760 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
2f770 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
2f780 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
2f790 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
2f7a0 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
2f7b0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2f7c0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
2f7d0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
2f7e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2f7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2f800 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2f810 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
2f820 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
2f830 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
2f840 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
2f850 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2f860 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
2f870 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
2f880 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
2f890 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2f8a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
2f8b0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2f8c0 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
2f8d0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
2f8e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2f8f0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2f900 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f910 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
2f920 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
2f930 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
2f940 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
2f950 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
2f960 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
2f970 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
2f980 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
2f990 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2f9a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
2f9b0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
2f9c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f9d0 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
2f9e0 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
2f9f0 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
2fa00 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2fa10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2fa20 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
2fa30 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
2fa40 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20  reeDropTable(p, 
2fa50 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29  iTable, piMoved)
2fa60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2fa70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2fa80 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2fa90 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
2faa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
2fab0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
2fac0 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
2fad0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2fae0 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
2faf0 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
2fb00 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
2fb10 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
2fb20 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
2fb30 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
2fb40 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
2fb50 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
2fb60 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
2fb70 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
2fb80 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
2fb90 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
2fba0 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
2fbb0 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
2fbc0 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
2fbd0 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
2fbe0 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
2fbf0 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
2fc00 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
2fc10 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
2fc20 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
2fc30 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
2fc40 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
2fc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2fc60 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
2fc70 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
2fc80 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
2fc90 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e  e *pDbPage;.  in
2fca0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
2fcb0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
2fcc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2fcd0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
2fce0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2fcf0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
2fd00 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
2fd10 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
2fd20 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
2fd30 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
2fd40 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
2fd50 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2fd60 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
2fd70 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
2fd80 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2fd90 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
2fda0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
2fdb0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
2fdc0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
2fdd0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
2fde0 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
2fdf0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
2fe00 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65  se by queryTable
2fe10 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54  Lock() and lockT
2fe20 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  able())..  */.  
2fe30 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
2fe40 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
2fe50 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
2fe60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fe70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2fe80 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
2fe90 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
2fea0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2feb0 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d  dx<=15 );.  rc =
2fec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2fed0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
2fee0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
2fef0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
2ff00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2ff10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2ff20 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e  .  }.  pP1 = (un
2ff30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
2ff40 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
2ff50 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  a(pDbPage);.  *p
2ff60 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
2ff70 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2ff80 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2ff90 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
2ffa0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
2ffb0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
2ffc0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2ffd0 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
2ffe0 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
2fff0 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
30000 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
30010 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
30020 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
30030 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
30040 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30050 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
30060 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
30070 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
30080 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
30090 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
300a0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
300b0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
300c0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
300d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
300e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
300f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
30100 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
30110 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
30120 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
30130 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
30140 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
30150 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
30160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30170 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
30180 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
30190 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
301a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
301b0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
301c0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
301d0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
301e0 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
301f0 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
30200 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
30210 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
30220 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
30230 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
30240 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
30250 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
30260 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
30270 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
30280 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
30290 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
302a0 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  .    pP1 = pBt->
302b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
302c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
302d0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
302e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
302f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30310 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
30320 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
30330 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30340 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30350 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  M.      if( idx=
30360 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =7 ){.        as
30370 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
30380 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d  acuum || iMeta==
30390 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
303a0 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c  ert( iMeta==0 ||
303b0 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20   iMeta==1 );.   
303c0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
303d0 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20  cuum = iMeta;.  
303e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
303f0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
30400 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30420 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
30430 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
30440 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
30450 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
30460 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
30470 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
30480 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
30490 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
304a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
304b0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
304c0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
304d0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
304e0 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
304f0 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
30500 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
30510 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
30520 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
30530 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72  age;.  restoreOr
30540 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
30550 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
30560 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30570 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
30580 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
30590 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
305a0 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
305b0 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
305c0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
305d0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
305e0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
305f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
30600 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
30610 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
30620 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
30630 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
30640 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
30650 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
30660 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
30670 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
30680 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
30690 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
306a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
306b0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
306c0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
306d0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
306e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
306f0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
30700 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
30710 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
30720 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
30730 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
30740 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
30750 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
30760 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
30770 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70  *zMsg2;.  if( !p
30780 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
30790 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
307a0 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
307b0 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
307c0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
307d0 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73  at);.  zMsg2 = s
307e0 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 30  qlite3VMPrintf(0
307f0 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
30800 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
30810 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
30820 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
30830 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
30840 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
30850 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
30860 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
30870 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
30880 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
30890 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
308a0 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
308b0 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
308c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
308d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
308e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
308f0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
30900 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
30910 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  g, zMsg1, zMsg2,
30920 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a   (char*)0);.  }.
30930 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30940 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
30950 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30960 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
30970 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
30980 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
30990 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
309a0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
309b0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
309c0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
309d0 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
309e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
309f0 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
30a00 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
30a10 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
30a20 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
30a30 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
30a40 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
30a50 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
30a60 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
30a70 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
30a80 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
30a90 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
30aa0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
30ab0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
30ac0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
30ad0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
30ae0 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
30af0 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
30b00 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
30b10 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
30b20 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
30b30 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
30b40 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
30b50 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
30b60 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30b70 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
30b80 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
30b90 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30ba0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
30bb0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
30bc0 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
30bd0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30be0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30bf0 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
30c00 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
30c10 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30c20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
30c30 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
30c40 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
30c50 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
30c60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30c70 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
30c80 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
30c90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30ca0 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
30cb0 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
30cc0 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
30cd0 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
30ce0 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
30cf0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
30d00 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
30d10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
30d20 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
30d30 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30d40 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
30d50 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
30d60 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
30d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
30d80 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
30d90 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
30da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
30db0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
30dc0 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
30dd0 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
30de0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
30df0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
30e00 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
30e10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30e20 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
30e30 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
30e40 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
30e50 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
30e60 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
30e70 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
30e80 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
30e90 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
30ea0 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
30eb0 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
30ec0 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
30ed0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
30ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ef0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30f00 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30f10 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
30f20 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
30f30 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
30f40 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
30f50 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
30f60 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
30f70 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
30f80 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30f90 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30fa0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
30fb0 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
30fc0 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
30fd0 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
30fe0 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
30ff0 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
31000 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
31010 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
31020 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
31030 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
31040 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
31050 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
31060 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31070 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
31080 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
31090 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
310a0 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
310b0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
310c0 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
310d0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
310e0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
310f0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
31100 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
31110 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
31120 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
31130 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
31140 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
31150 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
31160 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31170 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
31180 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
31190 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
311a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311b0 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
311c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
311d0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
311e0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
311f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
31200 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
31210 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
31220 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
31230 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
31240 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
31250 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65   N-- > 0 && pChe
31260 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20  ck->mxErr ){.   
31270 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61   DbPage *pOvflPa
31280 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ge;.    unsigned
31290 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61   char *pOvflData
312a0 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c  ;.    if( iPage<
312b0 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
312c0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
312d0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
312e0 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70       "%d of %d p
312f0 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f  ages missing fro
31300 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  m overflow list 
31310 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c  starting at %d",
31320 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20  .          N+1, 
31330 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74  expected, iFirst
31340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
31350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
31360 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31370 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20  Page, zContext) 
31380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
31390 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
313a0 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c  (pCheck->pPager,
313b0 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
313c0 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20  OvflPage) ){.   
313d0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
313e0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
313f0 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67  xt, "failed to g
31400 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  et page %d", iPa
31410 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ge);.      break
31420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66  ;.    }.    pOvf
31430 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  lData = (unsigne
31440 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
31450 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76  PagerGetData(pOv
31460 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  flPage);.    if(
31470 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20   isFreeList ){. 
31480 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74       int n = get
31490 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
314a0 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [4]);.#ifndef SQ
314b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
314c0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
314d0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
314e0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
314f0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31500 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52  heck, iPage, PTR
31510 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31520 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31540 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70   if( n>pCheck->p
31550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
31560 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  -8 ){.        ch
31570 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31580 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31590 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c            "freel
315a0 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74  ist leaf count t
315b0 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25  oo big on page %
315c0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
315d0 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d      N--;.      }
315e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
315f0 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
31600 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  {.          Pgno
31610 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74   iFreePage = get
31620 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
31630 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
31640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31650 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
31660 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
31670 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
31690 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
316a0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
316b0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
316c0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
316d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
316e0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
316f0 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
31700 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31720 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
31730 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
31740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31750 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
31760 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
31770 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
31780 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
31790 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
317a0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
317b0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
317c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
317d0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
317e0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
317f0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
31800 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
31810 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
31820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31830 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
31840 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
31850 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
31860 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
31870 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65  ta);.        che
31880 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31890 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46   i, PTRMAP_OVERF
318a0 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW2, iPage, zCo
318b0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
318c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
318d0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
318e0 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
318f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31900 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ref(pOvflPage);.
31910 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
31920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31930 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
31940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31950 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31960 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72  ECK./*.** Do var
31970 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63  ious sanity chec
31980 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70  ks on a single p
31990 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20  age of a tree.  
319a0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72  Return.** the tr
319b0 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20  ee depth.  Root 
319c0 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20  pages return 0. 
319d0 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74   Parents of root
319e0 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e   pages.** return
319f0 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68   1, and so forth
31a00 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63  ..** .** These c
31a10 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a  hecks are done:.
31a20 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d  **.**      1.  M
31a30 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65  ake sure that ce
31a40 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63  lls and freebloc
31a50 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61  ks do not overla
31a60 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75  p.**          bu
31a70 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d  t combine to com
31a80 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68  pletely cover th
31a90 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20  e page..**  NO  
31aa0 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65  2.  Make sure ce
31ab0 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f  ll keys are in o
31ac0 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e  rder..**  NO  3.
31ad0 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
31ae0 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ey is less than 
31af0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77  or equal to zLow
31b00 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20  erBound..**  NO 
31b10 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   4.  Make sure n
31b20 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72  o key is greater
31b30 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
31b40 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a  o zUpperBound..*
31b50 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b  *      5.  Check
31b60 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
31b70 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
31b80 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65  ..**      6.  Re
31b90 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63  cursively call c
31ba0 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20  heckTreePage on 
31bb0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a  all children..**
31bc0 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79        7.  Verify
31bd0 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20   that the depth 
31be0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
31bf0 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20  is the same..** 
31c00 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75       8.  Make su
31c10 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20  re this page is 
31c20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c  at least 33% ful
31c30 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a  l or else it is.
31c40 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20  **          the 
31c50 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
31c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31c70 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20  checkTreePage(. 
31c80 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
31c90 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78  heck,  /* Contex
31ca0 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79  t for the sanity
31cb0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
31cc0 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
31cd0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31ce0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
31cf0 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61  check */.  MemPa
31d00 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
31d10 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
31d20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65  */.  char *zPare
31d30 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61  ntContext  /* Pa
31d40 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rent context */.
31d50 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
31d60 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  age;.  int i, rc
31d70 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e  , depth, d2, pgn
31d80 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64  o, cnt;.  int hd
31d90 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20  r, cellStart;.  
31da0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
31db0 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  *data;.  BtShare
31dc0 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73  d *pBt;.  int us
31dd0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72  ableSize;.  char
31de0 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a   zContext[100];.
31df0 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20    char *hit;..  
31e00 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31e10 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
31e20 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  ), zContext, "Pa
31e30 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
31e40 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
31e50 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
31e60 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
31e70 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
31e80 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
31e90 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
31ea0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
31eb0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
31ec0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31ed0 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
31ee0 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
31ef0 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ;.  if( (rc = sq
31f00 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
31f10 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
31f20 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
31f30 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
31f40 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31f50 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
31f60 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
31f70 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
31f80 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
31f90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
31fa0 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  }.  if( (rc = sq
31fb0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
31fc0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
31fd0 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  t))!=0 ){.    ch
31fe0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31ff0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32010 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65     "sqlite3Btree
32020 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  InitPage() retur
32030 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  ns error code %d
32040 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65  ", rc);.    rele
32050 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32060 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
32070 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75  }..  /* Check ou
32080 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e  t all the cells.
32090 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20  .  */.  depth = 
320a0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
320b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20  pPage->nCell && 
320c0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69  pCheck->mxErr; i
320d0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
320e0 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ll;.    int sz;.
320f0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
32100 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  o;..    /* Check
32110 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f   payload overflo
32120 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20  w pages.    */. 
32130 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32140 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
32150 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  ext), zContext,.
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
32170 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65   tree page %d ce
32180 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c  ll %d: ", iPage,
32190 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d   i);.    pCell =
321a0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
321b0 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  i);.    sqlite3B
321c0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
321d0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
321e0 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
321f0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
32200 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
32210 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e  ey ) sz += info.
32220 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74  nKey;.    assert
32230 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ( sz==info.nPayl
32240 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  oad );.    if( s
32250 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  z>info.nLocal ){
32260 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
32270 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c   = (sz - info.nL
32280 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a  ocal + usableSiz
32290 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69  e - 5)/(usableSi
322a0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50  ze - 4);.      P
322b0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
322c0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
322d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
322e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
322f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32300 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
32310 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32320 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
32330 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66  (pCheck, pgnoOvf
32340 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
32350 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW1, iPage, zCon
32360 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
32370 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63  endif.      chec
32380 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c  kList(pCheck, 0,
32390 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65   pgnoOvfl, nPage
323a0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
323b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
323c0 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20   sanity of left 
323d0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
323e0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
323f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
32400 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
32410 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  (pCell);.#ifndef
32420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32430 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
32440 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32450 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
32460 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32470 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
32480 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  REE, iPage, zCon
32490 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
324a0 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d  endif.      d2 =
324b0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
324c0 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65  Check,pgno,pPage
324d0 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ,zContext);.    
324e0 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21    if( i>0 && d2!
324f0 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  =depth ){.      
32500 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32510 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32520 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64  t, "Child page d
32530 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a  epth differs");.
32540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
32550 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a  pth = d2;.    }.
32560 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
32570 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
32580 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
32590 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
325a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
325b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
325c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
325d0 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
325e0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
325f0 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67           "On pag
32600 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68  e %d at right ch
32610 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a  ild: ", iPage);.
32620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32630 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32640 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32650 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
32660 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
32670 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
32680 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30  _BTREE, iPage, 0
32690 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
326a0 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
326b0 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  e(pCheck, pgno, 
326c0 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  pPage, zContext)
326d0 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65  ;.  }. .  /* Che
326e0 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20  ck for complete 
326f0 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20  coverage of the 
32700 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61  page.  */.  data
32710 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
32720 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
32730 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74  hdrOffset;.  hit
32740 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
32750 5a 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a 65  Zero( usableSize
32760 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b   );.  if( hit ){
32770 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
32780 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61   1, get2byte(&da
32790 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20  ta[hdr+5]));.   
327a0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
327b0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
327c0 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
327d0 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
327e0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
327f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
32800 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
32810 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
32820 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
32830 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20  *2]);.      u16 
32840 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
32850 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
32860 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pc]);.      int 
32870 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63  j;.      if( (pc
32880 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
32890 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
328a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
328b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
328c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
328d0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
328e0 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
328f0 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
32900 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
32910 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
32920 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
32930 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
32940 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
32950 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
32960 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
32970 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
32980 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
32990 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
329a0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
329b0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
329c0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
329d0 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
329e0 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
329f0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
32a00 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
32a10 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32a20 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
32a30 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
32a40 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
32a50 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
32a60 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
32a70 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
32a80 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
32a90 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
32aa0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
32ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32ac0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
32ad0 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
32ae0 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
32af0 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
32b00 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
32b10 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
32b20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
32b30 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
32b40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
32b50 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32b60 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
32b70 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
32b80 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
32b90 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
32ba0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32bc0 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
32bd0 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
32be0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32bf0 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
32c00 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
32c10 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
32c20 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
32c30 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
32c40 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
32c50 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
32c60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
32c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 74  sqlite3_free(hit
32c80 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
32c90 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
32ca0 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65  rn depth+1;.}.#e
32cb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32cc0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32cd0 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
32ce0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32cf0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32d00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
32d10 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63  oes a complete c
32d20 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65  heck of the give
32d30 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61  n BTree file.  a
32d40 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20  Root[] is.** an 
32d50 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e  array of pages n
32d60 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68  umbers were each
32d70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
32d80 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32d90 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52  .** a table.  nR
32da0 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  oot is the numbe
32db0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
32dc0 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aRoot..**.** If 
32dd0 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b  everything check
32de0 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74  s out, this rout
32df0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
32e00 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  .  If something 
32e10 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20  is.** amiss, an 
32e20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
32e30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
32e40 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
32e50 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61  om malloc().** a
32e60 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
32e70 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61  that error messa
32e80 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ge is returned. 
32e90 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
32ea0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
32eb0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
32ec0 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
32ed0 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73  ssage when it is
32ee0 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a   done..*/.char *
32ef0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
32f00 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74  grityCheck(.  Bt
32f10 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54  ree *p,     /* T
32f20 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63  he btree to be c
32f30 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
32f40 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20  *aRoot,   /* An 
32f50 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61  array of root pa
32f60 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ges numbers for 
32f70 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73  individual trees
32f80 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c   */.  int nRoot,
32f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
32fa0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
32fb0 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  t[] */.  int mxE
32fc0 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72  rr,    /* Stop r
32fd0 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20  eporting errors 
32fe0 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20  after this many 
32ff0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20  */.  int *pnErr 
33000 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62     /* Write numb
33010 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
33020 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62  n to this variab
33030 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
33040 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20  ;.  int nRef;.  
33050 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65  IntegrityCk sChe
33060 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ck;.  BtShared *
33070 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
33080 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
33090 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
330a0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66   = p->db;.  nRef
330b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
330c0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
330d0 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  ger);.  if( lock
330e0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
330f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
33100 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33110 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
33120 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44  turn sqlite3StrD
33130 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63  up("Unable to ac
33140 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63  quire a read loc
33150 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33160 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  e");.  }.  sChec
33170 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73  k.pBt = pBt;.  s
33180 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70  Check.pPager = p
33190 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43  Bt->pPager;.  sC
331a0 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c  heck.nPage = sql
331b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
331c0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
331d0 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
331e0 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
331f0 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
33200 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
33210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33220 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
33230 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
33240 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
33250 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
33260 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
33270 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
33280 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
33290 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
332a0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
332b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
332c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
332d0 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
332e0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
332f0 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
33300 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
33310 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
33320 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
33330 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    unlockB
33340 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
33350 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  );.    *pnErr = 
33360 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
33370 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
33380 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
33390 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55  Printf(p->db, "U
333a0 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  nable to malloc 
333b0 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20  %d bytes", .    
333c0 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67      (sCheck.nPag
333d0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
333e0 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20  ck.anRef[0]));. 
333f0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
33400 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
33410 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
33420 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
33430 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
33440 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
33450 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
33460 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
33470 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
33480 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67    sCheck.zErrMsg
33490 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
334a0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
334b0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
334c0 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
334d0 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
334e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
334f0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
33500 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
33510 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
33520 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
33530 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
33540 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
33550 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
33560 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
33570 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b  <nRoot && sCheck
33580 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  .mxErr; i++){.  
33590 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
335a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
335b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
335c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
335d0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
335e0 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
335f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
33600 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
33610 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
33620 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
33630 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
33640 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
33650 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
33660 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
33670 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
33680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
33690 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
336a0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
336b0 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
336c0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
336d0 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68  eck.nPage && sCh
336e0 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
336f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
33700 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33710 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
33720 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
33730 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33740 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
33750 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
33760 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
33770 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
33780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
33790 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
337a0 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
337b0 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
337c0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
337d0 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
337e0 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
337f0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
33800 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
33810 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
33820 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
33830 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
33840 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
33850 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
33860 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
33870 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
33880 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
33890 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
338a0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
338b0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
338c0 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
338d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
338e0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
338f0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
33900 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
33910 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
33920 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
33930 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
33940 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
33950 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
33960 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
33970 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
33980 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
33990 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
339a0 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
339b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
339c0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
339d0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
339e0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
339f0 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
33a00 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
33a10 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
33a20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
33a30 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
33a40 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f, sqlite3PagerR
33a50 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
33a60 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ger).    );.  }.
33a70 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20  .  /* Clean  up 
33a80 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72  and report error
33a90 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
33aa0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
33ac0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
33ad0 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
33ae0 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  nErr;.  return s
33af0 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
33b00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33b10 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33b20 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
33b30 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
33b40 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
33b50 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
33b60 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
33b70 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e   The pager filen
33b80 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
33b90 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
33ba0 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
33bb0 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
33bc0 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
33bd0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
33be0 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
33bf0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
33c00 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
33c10 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
33c20 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
33c30 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
33c40 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
33c50 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
33c60 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
33c70 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
33c80 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
33c90 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
33ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33cb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
33cc0 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ger directory na
33cd0 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
33ce0 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
33cf0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
33d00 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
33d10 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
33d20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
33d30 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
33d40 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
33d50 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
33d60 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
33d70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
33d80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
33d90 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
33da0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
33db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33dc0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
33dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
33de0 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
33df0 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
33e00 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
33e10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
33e20 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
33e30 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
33e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
33e50 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
33e60 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   or not..**.** T
33e70 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c  he pager journal
33e80 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
33e90 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33ea0 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33eb0 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
33ec0 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
33ed0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
33ee0 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
33ef0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
33f00 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
33f10 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
33f20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
33f30 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
33f40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33f50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
33f60 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
33f70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
33f80 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
33f90 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
33fa0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
33fb0 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
33fc0 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
33fd0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
33fe0 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
33ff0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
34000 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54   size of file pT
34010 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  o may be reduced
34020 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
34030 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
34040 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
34050 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
34060 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20  n pTo is rolled 
34070 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
34080 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d  successful, Comm
34090 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79  itPhaseOne() may
340a0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54   be called on pT
340b0 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
340c0 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ng. .** The call
340d0 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68  er should finish
340e0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
340f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
34100 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  To by calling.**
34110 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
34120 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  mit()..*/.static
34130 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69   int btreeCopyFi
34140 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
34150 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
34160 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34170 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20  OK;.  Pgno i;.. 
34180 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b   Pgno nFromPage;
34190 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
341a0 66 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d  f pages in pFrom
341b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61   */.  Pgno nToPa
341c0 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ge;       /* Num
341d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
341e0 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e  pTo */.  Pgno nN
341f0 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  ewPage;      /* 
34200 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
34210 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65  in pTo after the
34220 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f   copy */..  Pgno
34230 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   iSkip;         
34240 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20  /* Pending byte 
34250 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  page in pTo */. 
34260 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65   int nToPageSize
34270 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ;    /* Page siz
34280 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65  e of pTo in byte
34290 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d  s */.  int nFrom
342a0 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61  PageSize;  /* Pa
342b0 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d  ge size of pFrom
342c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
342d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
342e0 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
342f0 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
34300 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
34310 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
34320 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
34330 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
34340 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d  .  nToPageSize =
34350 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
34360 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  ;.  nFromPageSiz
34370 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67  e = pBtFrom->pag
34380 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54  eSize;..  if( pT
34390 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
343a0 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
343b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
343c0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
343d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
343e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
343f0 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  To->pCursor ){. 
34400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34410 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54  _BUSY;.  }..  nT
34420 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
34430 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
34440 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
34450 6e 46 72 6f 6d 50 61 67 65 20 3d 20 73 71 6c 69  nFromPage = sqli
34460 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
34470 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
34480 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45  r);.  iSkip = PE
34490 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
344a0 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61  pBtTo);..  /* Va
344b0 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20  riable nNewPage 
344c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
344d0 20 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20   pages required 
344e0 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a  to store the.  *
344f0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46  * contents of pF
34500 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75  rom using the cu
34510 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20  rrent page-size 
34520 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  of pTo..  */.  n
34530 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29  NewPage = ((i64)
34540 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34  nFromPage * (i64
34550 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b  )nFromPageSize +
34560 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
34570 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20  e - 1) / .      
34580 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
34590 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  ;..  for(i=1; rc
345a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
345b0 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c  i<=nToPage || i<
345c0 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29  =nNewPage); i++)
345d0 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  {..    /* Journa
345e0 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  l the original p
345f0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
34600 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20  ** iSkip is the 
34610 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
34620 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20  he locking page 
34630 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  (PENDING_BYTE_PA
34640 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61  GE).    ** in da
34650 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66  tabase *pTo (bef
34660 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54  ore the copy). T
34670 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65  his page is neve
34680 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a  r written .    *
34690 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  * into the journ
346a0 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20  al file. Unless 
346b0 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20  i==iSkip or the 
346c0 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  page was not.   
346d0 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70   ** present in p
346e0 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  To before the co
346f0 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f  py operation, jo
34700 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f  urnal page i fro
34710 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  m pTo..    */.  
34720 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26    if( i!=iSkip &
34730 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a  & i<=nToPage ){.
34740 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
34750 62 50 61 67 65 3b 0a 20 20 20 20 20 20 72 63 20  bPage;.      rc 
34760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
34770 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
34780 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   i, &pDbPage);. 
34790 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
347a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
347b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
347c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
347d0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
347e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
347f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34800 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
34810 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
34820 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49       /* Yeah.  I
34830 74 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f  t seems wierd to
34840 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28   call DontWrite(
34850 29 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72  ) right after Wr
34860 69 74 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20  ite(). But.     
34870 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65     ** that is be
34880 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20  cause the names 
34890 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75  of those procedu
348a0 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74  res do not exact
348b0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ly .        ** r
348c0 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68  epresent what th
348d0 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20  ey do.  Write() 
348e0 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75  really means "pu
348f0 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74  t this page in t
34900 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  he.        ** ro
34910 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
34920 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69  nd mark it as di
34930 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  rty so that it w
34940 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20  ill be written. 
34950 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65         ** to the
34960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
34970 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
34980 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
34990 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
349a0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
349b0 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
349c0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
349d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
349e0 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20  tabase. The.    
349f0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
34a00 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
34a10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
34a20 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
34a30 69 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  is the .        
34a40 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20 6f  ** whole point o
34a50 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74 6f  f this block: to
34a60 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68   put pages on th
34a70 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
34a80 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  al. .        */.
34a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
34aa0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44  agerDontWrite(pD
34ab0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  bPage);.      }.
34ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34ad0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
34ae0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
34af0 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64 61  Overwrite the da
34b00 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66 20  ta in page i of 
34b10 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
34b20 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ase */.    if( r
34b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34b40 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
34b50 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20 20  NewPage ){..    
34b60 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61 67    DbPage *pToPag
34b70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
34b80 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b  ite3_int64 iOff;
34b90 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
34ba0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
34bb0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
34bc0 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
34bd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34be0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
34bf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34c00 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ite(pToPage);.  
34c10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
34c20 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d 28  (.        iOff=(
34c30 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
34c40 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  ; .        rc==S
34c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
34c60 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  <i*nToPageSize; 
34c70 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
34c80 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20   nFromPageSize. 
34c90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34ca0 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67  DbPage *pFromPag
34cb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  e = 0;.        P
34cc0 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
34cd0 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
34ce0 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  +1;..        if(
34cf0 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f   iFrom==PENDING_
34d00 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f  BYTE_PAGE(pBtFro
34d10 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m) ){.          
34d20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
34d30 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
34d40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
34d50 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
34d60 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d  r, iFrom, &pFrom
34d70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
34d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
34da0 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65  ar *zTo = sqlite
34db0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 54  3PagerGetData(pT
34dc0 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  oPage);.        
34dd0 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20    char *zFrom = 
34de0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
34df0 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ata(pFromPage);.
34e00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
34e10 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  opy;..          
34e20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  if( nFromPageSiz
34e30 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29  e>=nToPageSize )
34e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  {.            zF
34e50 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54  rom += ((i-1)*nT
34e60 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69 46  oPageSize - ((iF
34e70 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65  rom-1)*nFromPage
34e80 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
34e90 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50      nCopy = nToP
34ea0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
34eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34ec0 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28        zTo += (((
34ed0 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61  iFrom-1)*nFromPa
34ee0 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a  geSize) - (i-1)*
34ef0 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20 20  nToPageSize);.  
34f00 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
34f10 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b  = nFromPageSize;
34f20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
34f30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
34f40 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79  To, zFrom, nCopy
34f50 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
34f60 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
34f70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
34f80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
34f90 20 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69 74   pToPage ) sqlit
34fa0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f  e3PagerUnref(pTo
34fb0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
34fc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67 73  ..  /* If things
34fd0 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f 20   have worked so 
34fe0 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61 73  far, the databas
34ff0 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64 20  e file may need 
35000 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75 6e  to be .  ** trun
35010 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70 6c  cated. The compl
35020 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74 20  ex part is that 
35030 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
35040 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 20  e truncated to. 
35050 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74 20   ** a size that 
35060 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
35070 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e 54  r multiple of nT
35080 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65 20  oPageSize - the 
35090 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
350a0 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
350b0 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
350c0 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65 20  ted with B-Tree 
350d0 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  pTo..  **.  ** F
350e0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79 20  or example, say 
350f0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
35100 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79 74   pTo is 2048 byt
35110 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69  es and the origi
35120 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  nal .  ** number
35130 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20 28   of pages is 5 (
35140 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66 20  10 KB file). If 
35150 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67 65  pFrom has a page
35160 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a 20   size of 1024 . 
35170 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39 20   ** bytes and 9 
35180 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
35190 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
351a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39 4b   truncated to 9K
351b0 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  B..  */.  if( rc
351c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
351d0 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65     if( nFromPage
351e0 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69 7a  Size!=nToPageSiz
351f0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
35200 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
35210 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
35220 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  e(pBtTo->pPager)
35230 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69 7a  ;.      i64 iSiz
35240 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50 61  e = (i64)nFromPa
35250 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e 46  geSize * (i64)nF
35260 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20 69  romPage;.      i
35270 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29 28  64 iNow = (i64)(
35280 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61 67  (nToPage>nNewPag
35290 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77 50  e)?nToPage:nNewP
352a0 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f 50  age) * (i64)nToP
352b0 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
352c0 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20 28  i64 iPending = (
352d0 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59 54  (i64)PENDING_BYT
352e0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31 29  E_PAGE(pBtTo)-1)
352f0 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69   *(i64)nToPageSi
35300 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73 73  ze;.  .      ass
35310 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f 77  ert( iSize<=iNow
35320 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20   );.  .      /* 
35330 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e 65  Commit phase one
35340 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
35350 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
35360 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20 20  ed with pTo .   
35370 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
35380 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
35390 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  ta. It does not 
353a0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
353b0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
353c0 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64 6f  itself. After do
353d0 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20 73  ing this it is s
353e0 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72 75  afe to use OsTru
353f0 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68 65  ncate() and othe
35400 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
35410 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74 61  APIs on the data
35420 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63 74  base file direct
35430 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
35440 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70     pBtTo->db = p
35450 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72 63  To->db;.      rc
35460 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
35470 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
35480 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c 20  tTo->pPager, 0, 
35490 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 1);.      if(
354a0 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20 72   iSize<iNow && r
354b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
354c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
354d0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
354e0 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20 20  File, iSize);.  
354f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
35500 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20  * The loop that 
35510 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f 6d  copied data from
35520 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20   database pFrom 
35530 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a 20  to pTo did not. 
35540 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65       ** populate
35550 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35560 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70 54  e of database pT
35570 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d 73  o. If the page-s
35580 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ize of.      ** 
35590 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65 72  pFrom is smaller
355a0 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70 54   than that of pT
355b0 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 6f  o, this means so
355c0 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20 20  me data will.   
355d0 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 62     ** not have b
355e0 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20 20  een copied. .   
355f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
35600 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73  his block copies
35610 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61 74   the missing dat
35620 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  a from database 
35630 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20 20  pFrom to pTo .  
35640 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69 6c      ** using fil
35650 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73 20  e APIs. This is 
35660 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74 20  safe because at 
35670 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b 6e  this point we kn
35680 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ow that.      **
35690 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69 67   all of the orig
356a0 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20 70  inal data from p
356b0 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  To has been sync
356c0 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ed into the .   
356d0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
356e0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
356f0 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73 61  t it would be sa
35700 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  fe to do anythin
35710 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c  g at.      ** al
35720 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  l to the databas
35730 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74 72  e file except tr
35740 75 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65 72  uncate it to zer
35750 6f 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20 2a  o bytes..      *
35760 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
35770 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72  SQLITE_OK && nFr
35780 6f 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50 61  omPageSize<nToPa
35790 67 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e  geSize && iSize>
357a0 69 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  iPending){.     
357b0 20 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20 20     i64 iOff;.   
357c0 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20       for(.      
357d0 20 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69 6e      iOff=iPendin
357e0 67 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  g; .          rc
357f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
35800 4f 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e 54  Off<(iPending+nT
35810 6f 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20 20  oPageSize); .   
35820 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
35830 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20  FromPageSize.   
35840 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
35850 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50    DbPage *pFromP
35860 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
35870 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20     Pgno iFrom = 
35880 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53  (iOff/nFromPageS
35890 69 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20 20  ize)+1;.  .     
358a0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
358b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
358c0 45 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69 46  E(pBtFrom) || iF
358d0 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b  rom>nFromPage ){
358e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
358f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
35900 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
35910 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35920 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  rGet(pBtFrom->pP
35930 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46  ager, iFrom, &pF
35940 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35950 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35970 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d       char *zFrom
35980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35990 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65  etData(pFromPage
359a0 29 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71 6c  );.  .  rc = sql
359b0 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69 6c  ite3OsWrite(pFil
359c0 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50  e, zFrom, nFromP
359d0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a  ageSize, iOff);.
359e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
359f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46  te3PagerUnref(pF
35a00 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35a20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
35a30 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
35a40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35a80 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50  erSync(pBtTo->pP
35a90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
35aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35ac0 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
35ad0 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61 67  >pPager, nNewPag
35ae0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
35af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35b00 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  ){.      pBtTo->
35b10 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
35b20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
35b30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
35b40 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
35b50 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20  ck(pTo);.  }..  
35b60 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
35b70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
35b80 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70  opyFile(Btree *p
35b90 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d  To, Btree *pFrom
35ba0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
35bb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
35bc0 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pTo);.  sqlite3
35bd0 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d  BtreeEnter(pFrom
35be0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
35bf0 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72  opyFile(pTo, pFr
35c00 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  om);.  sqlite3Bt
35c10 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b  reeLeave(pFrom);
35c20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35c30 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74  eave(pTo);.  ret
35c40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
35c50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
35c60 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
35c70 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
35c80 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
35c90 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
35ca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35cb0 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
35cc0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
35cd0 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  p==0 || sqlite3_
35ce0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
35cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
35d00 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
35d10 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
35d20 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITE));.}../*.** 
35d30 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
35d40 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  if a statement t
35d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
35d60 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
35d70 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d  ite3BtreeIsInStm
35d80 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  t(Btree *p){.  a
35d90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
35da0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
35db0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
35dc0 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
35dd0 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
35de0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
35df0 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
35e00 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
35e10 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
35e20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35e30 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
35e40 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
35e50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35e60 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
35e70 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
35e80 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
35e90 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
35ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
35eb0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
35ec0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
35ed0 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
35ee0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
35ef0 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
35f00 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
35f10 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
35f20 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
35f30 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73  ts own.** purpos
35f40 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c  es (for example,
35f50 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68   to store a high
35f60 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73  -level schema as
35f70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
35f80 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  * the shared-btr
35f90 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c  ee). The btree l
35fa0 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66  ayer manages ref
35fb0 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20  erence counting 
35fc0 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  issues..**.** Th
35fd0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
35fe0 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  s is called on a
35ff0 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e   shared-btree, n
36000 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d  Bytes bytes of m
36010 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c  emory.** are all
36020 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20  ocated, zeroed, 
36030 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20  and returned to 
36040 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20  the caller. For 
36050 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
36060 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79  .** call the nBy
36070 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  tes parameter is
36080 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70   ignored and a p
36090 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61  ointer to the sa
360a0 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65  me blob.** of me
360b0 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a  mory returned. .
360c0 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72  **.** Just befor
360d0 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
360e0 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68  ee is closed, th
360f0 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65  e function passe
36100 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72  d as the .** xFr
36110 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  ee argument when
36120 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
36130 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20  cation was made 
36140 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  is invoked on th
36150 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c  e .** blob of al
36160 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20  located memory. 
36170 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
36180 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71  ould not call sq
36190 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20  lite3_free().** 
361a0 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  on the memory, t
361b0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64  he btree layer d
361c0 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  oes that..*/.voi
361d0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
361e0 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20  chema(Btree *p, 
361f0 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64  int nBytes, void
36200 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29  (*xFree)(void *)
36210 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
36220 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
36230 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
36240 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  (p);.  if( !pBt-
36250 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
36260 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
36270 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
36280 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42  (nBytes);.    pB
36290 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d  t->xFreeSchema =
362a0 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71   xFree;.  }.  sq
362b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
362c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  p);.  return pBt
362d0 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
362e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
362f0 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
36300 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
36310 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
36320 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
36330 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
36340 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
36350 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
36360 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
36370 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
36380 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
36390 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
363a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
363b0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
363c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
363d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
363e0 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54  ;.  rc = (queryT
363f0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
36400 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
36410 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b  CK)!=SQLITE_OK);
36420 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
36430 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
36440 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
36450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
36460 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
36470 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
36480 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
36490 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
364a0 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
364b0 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
364c0 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
364d0 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
364e0 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
364f0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
36500 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
36510 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
36520 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
36530 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
36540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36550 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  K;.  if( p->shar
36560 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c  able ){.    u8 l
36570 6f 63 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c  ockType = READ_L
36580 4f 43 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63  OCK + isWriteLoc
36590 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 52  k;.    assert( R
365a0 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54  EAD_LOCK+1==WRIT
365b0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  E_LOCK );.    as
365c0 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
365d0 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
365e0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  ock==1 );.    sq
365f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
36600 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65  p);.    rc = que
36610 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
36620 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
36630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
36650 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
36660 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
36670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
36680 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
36690 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
366a0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
366b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
366c0 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
366d0 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75  Argument pCsr mu
366e0 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f  st be a cursor o
366f0 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
36700 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b  g on an .** INTK
36710 45 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  EY table current
36720 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ly pointing at a
36730 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74   valid table ent
36740 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ry. .** This fun
36750 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74  ction modifies t
36760 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61  he data stored a
36770 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65  s part of that e
36780 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ntry..** Only th
36790 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d  e data content m
367a0 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66  ay only be modif
367b0 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  ied, it is not p
367c0 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68  ossible.** to ch
367d0 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20  ange the length 
367e0 6f 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  of the data stor
367f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
36800 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28 42  e3BtreePutData(B
36810 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75  tCursor *pCsr, u
36820 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
36830 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20  mt, void *z){.  
36840 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
36850 6c 64 73 4d 75 74 65 78 28 70 43 73 72 29 20 29  ldsMutex(pCsr) )
36860 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36870 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36880 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Csr->pBtree->db-
36890 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
368a0 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72  ert(pCsr->isIncr
368b0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69  blobHandle);.  i
368c0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e  f( pCsr->eState>
368d0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
368e0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
368f0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
36900 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
36910 20 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e     return pCsr->
36920 73 6b 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  skip;.    }else{
36930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
36940 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
36950 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
36960 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
36970 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
36980 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
36990 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
369a0 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
369b0 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
369c0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
369d0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
369e0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
369f0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
36a00 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
36a10 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
36a20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
36a30 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
36a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36a50 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
36a60 20 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e   assert( !pCsr->
36a70 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20  pBt->readOnly . 
36a80 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72           && pCsr
36a90 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
36aa0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
36ab0 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  E );.  if( check
36ac0 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e  ReadLocks(pCsr->
36ad0 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67  pBtree, pCsr->pg
36ae0 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b  noRoot, pCsr) ){
36af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36b00 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
36b10 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
36b20 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
36b30 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
36b40 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65  if( pCsr->eState
36b50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
36b60 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65   || !pCsr->pPage
36b70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
36b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
36b90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
36ba0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
36bb0 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCsr, offset, a
36bc0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
36bd0 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d  ar *)z, 0, 1);.}
36be0 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66  ../* .** Set a f
36bf0 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73  lag on this curs
36c00 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65 20  or to cache the 
36c10 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67  locations of pag
36c20 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  es from the .** 
36c30 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f  overflow list fo
36c40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
36c50 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  w. This is used 
36c60 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  by cursors opene
36c70 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65  d.** for increme
36c80 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c  ntal blob IO onl
36c90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
36ca0 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
36cb0 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74  ag only. The act
36cc0 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f  ual page locatio
36cd0 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72  n cache.** (stor
36ce0 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61  ed in BtCursor.a
36cf0 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61  Overflow[]) is a
36d00 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65  llocated and use
36d10 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  d by function.**
36d20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
36d30 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e   (the worker fun
36d40 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
36d50 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e 64  3BtreeData() and
36d60 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
36d70 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76  PutData())..*/.v
36d80 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
36d90 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74  CacheOverflow(Bt
36da0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
36db0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
36dc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
36dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36de0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36df0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
36e00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
36e10 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e  sert(!pCur->isIn
36e20 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20  crblobHandle);. 
36e30 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
36e40 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75  Overflow);.  pCu
36e50 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
36e60 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69  dle = 1;.}.#endi
36e70 66 0a                                            f.