/ Hex Artifact Content
Login

Artifact 6e60d634d236232efbb289b800dd76e72a5ecf9d:


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 34 37 20 32 30 30 38 2f 30  c,v 1.447 2008/0
0190: 33 2f 32 35 20 31 37 3a 32 33 3a 33 33 20 64 72  3/25 17:23:33 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 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15720 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15730 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
15740 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
15750 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
15760 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
15770 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
15780 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
15790 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
157a0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
157b0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
157c0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
15800 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
15840 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15850 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
15860 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
15870 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
15880 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
158d0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
158e0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 7d 0a 23 65          \.  }.#e
15920 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
15930 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
15940 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
15950 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
15960 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
15970 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
15980 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
15990 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
159a0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
159b0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
159c0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
159d0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
159e0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
159f0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
15a00 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
15a10 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
15a20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
15a30 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
15a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15a50 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
15a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15a70 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
15a80 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
15a90 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15aa0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15ab0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15ac0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
15ad0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
15ae0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15af0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
15b10 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
15b20 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15b30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
15b40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
15b50 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
15b60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15b70 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15b80 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
15b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
15ba0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
15bb0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
15bc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
15bd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15be0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15bf0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
15c00 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15c10 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
15c20 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
15c30 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
15c40 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
15c50 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
15c60 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
15c70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
15c80 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
15c90 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
15ca0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
15cb0 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
15cc0 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
15cd0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
15ce0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
15cf0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
15d00 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
15d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d20 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
15d30 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
15d40 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15d50 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15d60 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15d70 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
15d80 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
15d90 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15da0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
15dc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
15dd0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15de0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
15df0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
15e00 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
15e10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15e20 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15e30 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
15e40 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
15e50 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
15e60 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
15e70 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
15e80 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
15e90 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
15ea0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
15eb0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
15ec0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15ed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
15ee0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
15ef0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
15f00 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
15f10 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
15f20 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
15f30 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
15f40 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15f50 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
15f60 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
15f70 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
15f80 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
15f90 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
15fa0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
15fb0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
15fc0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
15fd0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
15fe0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
15ff0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
16000 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
16010 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
16020 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16030 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16040 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70  :.**.** Unless p
16050 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16060 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  , the page numbe
16070 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
16080 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20  erflow .** page 
16090 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
160a0 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  st is written to
160b0 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
160c0 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20  page ovfl.** is 
160d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
160e0 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74   its linked list
160f0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
16100 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
16110 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
16120 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61   not NULL, *ppPa
16130 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
16140 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65   MemPage* handle
16150 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66  .** for page ovf
16160 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  l. The underlyin
16170 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79  g pager page may
16180 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
16190 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  sted.** with the
161a0 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
161b0 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65  set, so the page
161c0 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65   data accessable
161d0 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e   via.** this han
161e0 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74  dle may not be t
161f0 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  rusted..*/.stati
16200 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
16210 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
16220 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
16230 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
16240 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
16250 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
16260 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
16270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16280 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
16290 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
162a0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
162b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
162c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
162d0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
162e0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69  no next = 0;.  i
162f0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16300 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16310 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16320 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   );.  /* One of 
16330 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62  these must not b
16340 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  e NULL. Otherwis
16350 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73  e, why call this
16360 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20   function? */.  
16370 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c  assert(ppPage ||
16380 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20   pPgnoNext);..  
16390 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20  /* If pPgnoNext 
163a0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
163b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
163c0 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f  eing called to o
163d0 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d  btain.  ** a Mem
163e0 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20  Page* reference 
163f0 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61  only. No page-da
16400 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ta is required i
16410 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16420 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65  /.  if( !pPgnoNe
16430 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  xt ){.    return
16440 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16450 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16460 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a  ppPage, 1);.  }.
16470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16480 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16490 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
164a0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
164b0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
164c0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
164d0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
164e0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
164f0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
16500 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
16510 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
16520 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
16530 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
16540 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
16550 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
16560 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
16570 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
16580 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
16590 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
165a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
165b0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
165c0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
165d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
165e0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
165f0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
16600 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
16610 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
16620 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
16630 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
16640 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
16650 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16660 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
16670 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
16680 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69  if( iGuess<=sqli
16690 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
166a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
166b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
166c0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
166d0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
166e0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
166f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16720 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16730 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
16740 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
16750 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
16760 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ss;.      }.    
16770 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16780 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70  if( next==0 || p
16790 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d  pPage ){.    Mem
167a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
167b0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
167c0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
167d0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
167e0 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20  , next!=0);.    
167f0 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
16800 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
16810 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d  );.    if( next=
16820 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
16830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
16840 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
16850 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16860 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67  }..    if( ppPag
16870 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  e ){.      *ppPa
16880 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20  ge = pPage;.    
16890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c  }else{.      rel
168a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
168b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
168c0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
168d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
168e0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
168f0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
16900 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
16910 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
16920 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
16930 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
16940 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
16950 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
16960 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
16970 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
16980 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
16990 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
169a0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
169b0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
169c0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
169d0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
169e0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
169f0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
16a00 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
16a10 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
16a20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
16a30 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
16a40 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
16a50 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
16a60 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
16a70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16a80 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
16a90 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
16aa0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
16ab0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
16ac0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
16ad0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
16ae0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
16af0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
16b00 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
16b10 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16b20 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
16b30 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16b50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
16b60 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
16b70 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
16b80 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
16b90 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
16ba0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
16bb0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
16bc0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
16bd0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
16be0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
16bf0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
16c00 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
16c10 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
16c20 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
16c30 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
16c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16c50 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
16c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16c90 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
16ca0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
16cb0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
16cc0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
16cd0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
16ce0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
16cf0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
16d00 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
16d10 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
16d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16d30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16d40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
16d50 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
16d60 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
16d70 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
16d80 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
16d90 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
16da0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
16db0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
16dc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
16dd0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
16de0 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
16df0 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
16e00 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
16e10 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
16e20 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
16e30 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
16e40 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
16e50 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
16e60 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
16e70 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
16e80 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
16e90 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
16ea0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
16eb0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
16ec0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16ed0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
16ee0 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
16ef0 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
16f00 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
16f10 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
16f20 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
16f30 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
16f40 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
16f50 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
16f60 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
16f70 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
16f80 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
16f90 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
16fa0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
16fb0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
16fc0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
16fd0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
16fe0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
16ff0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
17000 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
17010 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
17020 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
17030 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
17040 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
17050 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
17060 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
17070 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
17080 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
17090 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
170a0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
170b0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
170c0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
170d0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
170e0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
170f0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
17100 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
17110 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
17120 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
17130 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
17140 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
17150 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
17160 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
17170 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
17180 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
17190 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
171a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
171b0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
171c0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
171d0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
171e0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
171f0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
17200 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
17210 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
17220 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
17230 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
17240 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
17250 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
17260 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
17270 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17280 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
17290 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
172a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
172b0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
172c0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
172d0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
172e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
172f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
17300 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
17310 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
17320 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
17330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17340 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
17350 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
17360 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
17370 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
17380 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
17390 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
173a0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
173b0 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
173c0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
173d0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
173e0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
173f0 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
17400 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
17410 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
17420 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
17430 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
17440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
17450 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
17460 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
17470 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
17480 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74  pPage;     /* Bt
17490 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
174a0 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
174b0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
174c0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
174d0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
174e0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
174f0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
17500 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
17510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
17520 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17530 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
17540 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
17550 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
17560 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
17570 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
17580 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
17590 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
175a0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
175b0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
175c0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
175d0 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
175e0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
175f0 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
17600 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75  intKey ? 0 : pCu
17610 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
17620 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
17630 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
17640 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
17650 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
17660 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
17670 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  a ){.    /* Tryi
17680 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
17690 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
176a0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
176b0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
176c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
176d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ROR;.  }..  /* C
176e0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
176f0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
17700 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
17710 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
17720 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
17730 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
17740 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
17750 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
17760 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
17770 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
17780 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
17790 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
177a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
177b0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
177c0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
177d0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
177e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
177f0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
17800 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
17810 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
17820 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
17830 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
17840 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42  Local;.  }..  pB
17850 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
17860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17870 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
17880 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66     const int ovf
17890 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
178a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
178b0 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
178c0 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
178d0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
178e0 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
178f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
17900 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
17910 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
17920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17930 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
17940 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
17950 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
17960 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
17970 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
17980 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
17990 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
179a0 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
179b0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
179c0 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
179d0 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
179e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
179f0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
17a00 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
17a10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17a20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
17a30 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
17a40 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
17a50 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
17a60 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
17a70 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
17a80 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
17a90 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
17aa0 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
17ab0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
17ac0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
17ad0 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
17ae0 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
17af0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
17b00 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
17b10 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
17b20 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
17b30 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
17b40 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
17b50 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17b60 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
17b70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
17b80 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
17b90 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vfl);.      if( 
17ba0 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e  nOvfl && !pCur->
17bb0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
17bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17bd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
17be0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17bf0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17c00 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
17c10 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
17c20 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
17c30 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
17c40 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
17c50 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
17c60 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
17c70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
17c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17c90 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
17ca0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
17cb0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
17cc0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
17cd0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
17ce0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
17cf0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
17d00 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
17d10 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
17d20 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
17d30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
17d40 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
17d50 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
17d60 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
17d70 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
17d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
17d90 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
17da0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
17db0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
17dc0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17dd0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
17de0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17df0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17e00 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
17e10 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
17e20 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
17e30 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
17e40 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17e50 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
17e60 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
17e70 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
17e80 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
17e90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
17ea0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
17eb0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
17ec0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
17ed0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17ee0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
17ef0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
17f00 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
17f10 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
17f20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
17f30 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
17f40 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
17f50 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
17f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
17f70 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
17f80 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
17f90 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
17fa0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
17fb0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
17fc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
17fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17fe0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17ff0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
18000 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
18010 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
18020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
18030 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
18040 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
18050 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
18060 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
18070 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
18080 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
18090 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
180a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
180b0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
180c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
180d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
180e0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
180f0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
18100 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
18110 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
18120 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
18130 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
18140 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
18150 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
18160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18170 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
18180 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
18190 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
181a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
181b0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
181c0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
181d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
181f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
18200 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
18210 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
18220 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
18230 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
18240 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
18250 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
18260 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
18270 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
18280 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
18290 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
182a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
182b0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
182c0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
182d0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
182e0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
182f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18300 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
18310 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
18320 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
18330 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
18340 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
18350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18360 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18380 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
18390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
183a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
183b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
183c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
183d0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
183e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
183f0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
18400 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
18410 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
18420 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
18430 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
18440 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
18450 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
18460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18470 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
18480 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
18490 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
184a0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
184b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
184c0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
184d0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
184e0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
184f0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
18500 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
18510 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
18520 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
18530 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
18540 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18550 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18560 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
18570 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
18580 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
18590 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
185a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
185b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
185c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
185d0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
185e0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
185f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
18600 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18610 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
18620 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18630 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
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 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Page->intKey==0 
18660 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18670 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18680 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18690 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
186a0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
186b0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
186c0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
186d0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
186e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
186f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18700 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
18710 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
18720 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18730 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18740 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18750 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18760 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18770 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18780 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18790 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
187a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
187b0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
187c0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
187d0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
187e0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
187f0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
18800 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
18810 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18820 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18830 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18840 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18850 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18860 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18870 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
18880 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18890 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
188a0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
188b0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
188c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
188d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
188e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
188f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18900 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18920 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18930 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18940 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18950 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
18960 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
18970 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
18980 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
18990 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
189a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
189b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
189c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
189d0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
189e0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
189f0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
18a00 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
18a10 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
18a20 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
18a30 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18a40 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
18a50 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
18a60 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
18a70 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
18a80 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
18a90 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
18aa0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
18ab0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
18ac0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
18ad0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
18ae0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
18af0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
18b00 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
18b10 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
18b20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18b30 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18b40 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
18b50 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
18b60 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
18b70 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
18b80 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
18b90 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
18ba0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
18bb0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
18bc0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
18bd0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
18be0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
18bf0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
18c00 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
18c10 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
18c20 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
18c30 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
18c40 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
18c50 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
18c60 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
18c70 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74   reassembly.** t
18c80 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
18c90 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
18ca0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
18cb0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
18cc0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
18cd0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
18ce0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
18cf0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
18d00 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18d10 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
18d20 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
18d30 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
18d40 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
18d50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18d60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
18d70 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18d80 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
18d90 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18da0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
18db0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
18dc0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
18dd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
18de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18df0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
18e00 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
18e10 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
18e20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
18e30 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
18e40 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
18e50 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
18e60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18e70 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
18e80 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
18e90 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
18ea0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
18eb0 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
18ec0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18ed0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18ee0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18ef0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
18f00 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18f10 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
18f20 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
18f30 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  e;.  assert( pCu
18f40 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
18f50 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
18f60 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
18f70 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
18f80 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
18f90 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
18fa0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
18fb0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
18fc0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
18fd0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
18fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
18ff0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
19000 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
19010 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
19020 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
19030 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
19040 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19050 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
19060 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
19070 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19080 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
19090 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
190a0 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
190b0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
190c0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
190d0 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
190e0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
190f0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
19100 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
19110 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
19120 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
19130 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
19140 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
19150 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
19160 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
19170 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
19180 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
19190 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
191a0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
191b0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
191c0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
191d0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
191e0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
191f0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
19200 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
19210 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
19220 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
19230 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
19240 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
19250 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
19260 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
19270 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
19280 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
19290 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
192a0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
192b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
192c0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
192d0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
192e0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
192f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
19300 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
19310 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
19320 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
19330 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
19340 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
19350 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
19360 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19370 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19380 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
19390 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
193a0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
193b0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
193c0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
193d0 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
193e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
193f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
19400 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
19410 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
19420 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19430 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19440 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19450 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
19460 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19470 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
19480 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
19490 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
194a0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
194b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
194c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
194d0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
194e0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
194f0 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
19500 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
19510 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
19520 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
19530 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
19540 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
19550 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
19560 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
19570 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
19580 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
19590 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
195a0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
195b0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
195c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
195d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
195e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
195f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19600 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19610 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
19620 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
19630 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43  o, &pNewPage, pC
19640 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66  ur->pPage);.  if
19650 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19660 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64  ;.  pNewPage->id
19670 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  xParent = pCur->
19680 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20  idx;.  pOldPage 
19690 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
196a0 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68   pOldPage->idxSh
196b0 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  ift = 0;.  relea
196c0 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29  sePage(pOldPage)
196d0 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
196e0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
196f0 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
19700 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19710 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
19720 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
19730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19740 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19760 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19770 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
19780 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
19790 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
197a0 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  its table..**.**
197b0 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   The virtual roo
197c0 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f  t page is the ro
197d0 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74  ot page for most
197e0 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a   tables.  But.**
197f0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72   for the table r
19800 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c  ooted on page 1,
19810 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65   sometime the re
19820 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  al root page.** 
19830 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
19840 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
19850 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20  inter.  In such 
19860 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72  cases the.** vir
19870 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
19880 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
19890 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
198a0 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69  r of page.** 1 i
198b0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
198c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
198d0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  eeIsRootPage(Mem
198e0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
198f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19900 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19910 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19920 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
19930 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  x) );.  pParent 
19940 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
19950 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
19960 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19970 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
19980 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
19990 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
199a0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
199b0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
199c0 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
199d0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
199e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
199f0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
19a00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
19a10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
19a20 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19a30 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
19a40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
19a50 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
19a60 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
19a70 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
19a80 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
19a90 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
19aa0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
19ab0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19ac0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
19ad0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
19ae0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
19af0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19b00 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
19b10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19b20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19b30 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
19b40 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
19b50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
19b60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19b70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
19b80 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19b90 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19ba0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
19bb0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
19bc0 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
19bd0 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
19be0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
19bf0 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
19c00 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
19c10 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
19c20 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
19c30 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
19c40 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
19c50 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
19c60 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
19c70 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
19c80 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
19c90 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
19ca0 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
19cb0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
19cc0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
19cd0 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
19ce0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
19cf0 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
19d00 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19d10 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
19d20 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19d30 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
19d40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19d50 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
19d60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19d70 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
19d80 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
19d90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19da0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
19db0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19dc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19dd0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
19de0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
19df0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
19e00 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
19e10 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
19e20 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
19e30 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
19e40 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
19e50 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
19e60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19e70 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
19e80 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
19e90 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
19ea0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
19eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
19ec0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
19ed0 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
19ee0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19ef0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
19f00 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
19f10 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
19f20 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
19f30 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
19f40 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
19f50 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
19f60 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
19f70 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
19f80 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
19f90 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
19fa0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
19fb0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
19fc0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
19fd0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
19fe0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19ff0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1a000 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
1a010 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
1a020 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
1a030 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
1a040 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a050 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
1a060 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1a070 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1a080 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1a090 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a0a0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1a0b0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1a0c0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1a0d0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1a0e0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1a0f0 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1a100 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1a110 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1a120 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1a130 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1a140 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
1a150 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1a160 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a170 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
1a180 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
1a190 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a1b0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1a1c0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
1a1d0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a1e0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
1a1f0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1a200 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1a210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
1a220 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
1a230 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
1a240 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
1a250 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
1a260 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a280 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
1a290 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1a2a0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1a2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a2c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a2d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a2e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a2f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a300 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a310 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a320 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a330 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1a340 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
1a350 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1a360 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1a370 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
1a380 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1a390 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1a3a0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1a3b0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a  e, pCur->idx));.
1a3c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a3d0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a3e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a3f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a400 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a410 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1a420 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a430 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1a440 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1a450 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a460 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1a470 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1a480 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1a490 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1a4a0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1a4b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1a4c0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1a4d0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1a4e0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1a4f0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1a500 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1a510 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1a520 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a530 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1a540 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1a550 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1a560 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1a570 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1a580 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1a590 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a5b0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1a5c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a5d0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1a5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a5f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1a600 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1a610 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a620 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a630 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a640 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a650 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1a660 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1a670 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1a680 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1a690 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1a6a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1a6b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1a6c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  ;.    pCur->idx 
1a6d0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1a6e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a6f0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a700 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1a710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a720 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1a730 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1a740 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1a750 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ize = 0;.  }.  r
1a760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a770 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a780 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1a790 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1a7a0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1a7b0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1a7c0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1a7d0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1a7e0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a7f0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a800 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a810 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a820 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a840 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1a850 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1a860 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1a870 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a880 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a8a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a8b0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1a8c0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1a8d0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1a8e0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1a8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a900 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1a910 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1a920 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1a930 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1a940 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1a950 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1a960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1a970 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1a980 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a990 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1a9a0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1a9b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1a9c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1a9d0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1a9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a9f0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1aa00 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
1aa10 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1aa20 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1aa30 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1aa40 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1aa50 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1aa60 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1aa70 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1aa80 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1aa90 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1aaa0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1aab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
1aac0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1aad0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1aae0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
1aaf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ab00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ab10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ab20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1ab30 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1ab40 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1ab50 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1ab60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ab70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1ab80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1ab90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1aba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1abb0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1abc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1abd0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
1abe0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1abf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ac00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ac10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1ac20 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1ac30 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1ac40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ac50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ac60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1ac70 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1ac80 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1ac90 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1aca0 65 63 69 66 69 65 64 20 62 79 20 70 4b 65 79 2f  ecified by pKey/
1acb0 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52 65 74  nKey/pUnKey. Ret
1acc0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1acd0 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1ace0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  TKEY tables, onl
1acf0 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d  y the nKey param
1ad00 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1ad10 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55 6e 4b  Key .** and pUnK
1ad20 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ey must be NULL.
1ad30 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
1ad40 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e 4b 65  es, either pUnKe
1ad50 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e 74 20  y.** must point 
1ad60 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 68 61  to a key that ha
1ad70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  s already been u
1ad80 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c 73 65  npacked, or else
1ad90 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20 64 65  .** pKey/nKey de
1ada0 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62 20 63  scribes a blob c
1adb0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6b 65  ontaining the ke
1adc0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  y..**.** If an e
1add0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1ade0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1adf0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1ae00 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1ae10 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1ae20 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1ae30 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1ae40 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1ae50 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1ae60 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1ae70 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1ae80 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1ae90 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1aea0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1aeb0 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
1aec0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
1aed0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
1aee0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77  e.** cursor is w
1aef0 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20  ritten to *pRes 
1af00 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20  if pRes!=NULL.  
1af10 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a  The meaning of.*
1af20 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  * this value is 
1af30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1af40 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1af50 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1af60 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1af70 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1af80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1af90 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1afa0 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74  han pKey or if t
1afb0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1afc0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1afd0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1afe0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1aff0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1b000 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1b010 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1b020 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b030 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b040 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1b070 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   pKey..**.**    
1b080 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1b090 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1b0a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1b0b0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b0d0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b  s larger than pK
1b0e0 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
1b0f0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1b100 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1b110 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ur,        /* Th
1b120 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1b130 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oved */.  const 
1b140 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1b150 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74   /* The key cont
1b160 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  ent for indices.
1b170 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61    Not used by ta
1b180 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  bles */.  Unpack
1b190 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b 65 79  edRecord *pUnKey
1b1a0 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72  ,/* Unpacked ver
1b1b0 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a 2f 0a  sion of pKey */.
1b1c0 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1b1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b1e0 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68   of pKey.  Or th
1b1f0 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  e key for tables
1b200 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1b210 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ght,         /* 
1b220 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1b230 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1b240 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1b250 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1b260 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72       /* Search r
1b270 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b  esult flag */.){
1b280 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1b290 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a  r aSpace[200];..
1b2a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b2b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b2d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b2e0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1b2f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b300 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b310 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1b320 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b330 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b340 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1b350 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b360 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b370 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b380 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b390 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1b3a0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1b3b0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b3c0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1b3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b3e0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1b3f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b400 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 67  .    /* We are g
1b410 69 76 65 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c  iven an SQL tabl
1b420 65 20 74 6f 20 73 65 61 72 63 68 2e 20 20 54 68  e to search.  Th
1b430 65 20 6b 65 79 20 69 73 20 74 68 65 20 69 6e 74  e key is the int
1b440 65 67 65 72 0a 20 20 20 20 2a 2a 20 72 6f 77 69  eger.    ** rowi
1b450 64 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6e  d contained in n
1b460 4b 65 79 2e 20 20 70 4b 65 79 20 61 6e 64 20 70  Key.  pKey and p
1b470 55 6e 4b 65 79 20 73 68 6f 75 6c 64 20 62 6f 74  UnKey should bot
1b480 68 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  h be NULL */.   
1b490 20 61 73 73 65 72 74 28 20 70 55 6e 4b 65 79 3d   assert( pUnKey=
1b4a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1b4b0 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d  ( pKey==0 );.  }
1b4c0 65 6c 73 65 20 69 66 28 20 70 55 6e 4b 65 79 3d  else if( pUnKey=
1b4d0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  =0 ){.    /* We 
1b4e0 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e  are to search an
1b4f0 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67   SQL index using
1b500 20 61 20 6b 65 79 20 65 6e 63 6f 64 65 64 20 61   a key encoded a
1b510 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2a  s a blob..    **
1b520 20 54 68 65 20 62 6c 6f 62 20 69 73 20 66 6f 75   The blob is fou
1b530 6e 64 20 61 74 20 70 4b 65 79 20 61 6e 64 20 69  nd at pKey and i
1b540 73 20 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  s nKey bytes in 
1b550 6c 65 6e 67 74 68 2e 20 20 55 6e 70 61 63 6b 0a  length.  Unpack.
1b560 20 20 20 20 2a 2a 20 74 68 69 73 20 6b 65 79 20      ** this key 
1b570 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  so that we can u
1b580 73 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 61 73  se it. */.    as
1b590 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 29 3b  sert( pKey!=0 );
1b5a0 0a 20 20 20 20 70 55 6e 4b 65 79 20 3d 20 73 71  .    pUnKey = sq
1b5b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1b5c0 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
1b5d0 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  Info, nKey, pKey
1b5e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
1b610 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
1b620 20 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30 20    if( pUnKey==0 
1b630 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b640 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
1b650 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f      /* We are to
1b660 20 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69   search an SQL i
1b670 6e 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79  ndex using a key
1b680 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
1b690 20 75 6e 70 61 63 6b 65 64 0a 20 20 20 20 2a 2a   unpacked.    **
1b6a0 20 61 6e 64 20 68 61 6e 64 65 64 20 74 6f 20 75   and handed to u
1b6b0 73 20 69 6e 20 70 55 6e 4b 65 79 2e 20 2a 2f 0a  s in pUnKey. */.
1b6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1b6d0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  ==0 );.  }.  for
1b6e0 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
1b6f0 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
1b700 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
1b710 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1b720 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
1b730 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1b740 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1b750 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1b760 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1b770 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1b780 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1b790 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1b7a0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 55 6e 4b  ->intKey && pUnK
1b7b0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
1b7c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1b7d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1b7e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1b7f0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  h;.    }.    if(
1b800 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1b810 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1b820 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1b830 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1b840 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20  = (upr+lwr)/2;. 
1b850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72     }.    if( lwr
1b860 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b  <=upr ) for(;;){
1b870 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1b880 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1b890 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1b8a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b8b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
1b8c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1b8d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1b8e0 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1b8f0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b900 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1b910 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1b920 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1b930 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1b940 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1b950 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1b960 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1b970 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1b980 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
1b990 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1b9a0 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1b9b0 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20   *)&nCellKey);. 
1b9c0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1b9d0 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1b9e0 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1b9f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ba00 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b  nCellKey>nKey ){
1ba10 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1ba20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1ba30 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1ba40 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1ba50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba60 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1ba70 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1ba80 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1ba90 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1baa0 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1bab0 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1bac0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1bad0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1bae0 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1baf0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1bb00 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
1bb10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
1bb20 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1bb30 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20   pUnKey);.      
1bb40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bb50 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
1bb60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43  lite3_malloc( nC
1bb70 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ellKey );.      
1bb80 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
1bb90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1bba0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1bbb0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
1bbc0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1bbd0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
1bbe0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1bbf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1bc00 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
1bc10 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c  ey, (void *)pCel
1bc20 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1bc30 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
1bc40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
1bc50 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1bc60 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20  , pUnKey);.     
1bc70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1bc80 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
1bc90 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1bca0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1bcb0 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
1bcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bcd0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1bce0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1bcf0 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
1bd00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1bd10 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1bd20 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1bd30 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1bd40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bd50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd60 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1bd70 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1bd80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bd90 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1bda0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1bdb0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1bdc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1bdd0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1bde0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
1bdf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1be00 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
1be10 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
1be20 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
1be30 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
1be40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1be50 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28     pCur->idx = (
1be60 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
1be70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1be80 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1be90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1bea0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1beb0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1bec0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1bed0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bee0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1bef0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1bf00 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1bf10 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bf20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1bf30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bf40 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1bf50 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1bf60 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1bf70 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1bf80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1bf90 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1bfa0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
1bfb0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1bfc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
1bfd0 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
1bfe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bff0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
1c000 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1c010 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1c020 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70  idx = lwr;.    p
1c030 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c040 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1c050 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1c060 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1c070 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1c080 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
1c090 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 69  veto_finish:.  i
1c0a0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 2f  f( pKey ){.    /
1c0b0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
1c0c0 6f 75 72 20 6f 77 6e 20 75 6e 70 61 63 6b 65 64  our own unpacked
1c0d0 20 6b 65 79 20 61 74 20 74 68 65 20 74 6f 70 20   key at the top 
1c0e0 6f 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  of this.    ** p
1c0f0 72 6f 63 65 64 75 72 65 2c 20 74 68 65 6e 20 64  rocedure, then d
1c100 65 73 74 72 6f 79 20 74 68 61 74 20 6b 65 79 20  estroy that key 
1c110 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c120 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1c130 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1c140 65 64 52 65 63 6f 72 64 28 70 55 6e 4b 65 79 29  edRecord(pUnKey)
1c150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c160 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
1c170 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1c180 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1c190 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1c1a0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1c1b0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1c1c0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1c1d0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1c1e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1c1f0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1c200 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1c210 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1c220 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1c230 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1c240 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1c250 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1c260 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1c270 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1c280 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c290 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1c2a0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1c2b0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1c2c0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1c2d0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1c2e0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1c2f0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1c300 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1c310 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1c320 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1c330 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1c340 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1c350 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1c360 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1c370 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1c380 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1c390 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
1c3a0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
1c3b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
1c3c0 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  dle for a cursor
1c3d0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1c3e0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1c3f0 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f  Db(const BtCurso
1c400 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1c410 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c420 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1c430 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1c440 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
1c450 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a  ->pBtree->db;.}.
1c460 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1c470 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1c480 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1c490 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1c4a0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1c4b0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1c4c0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1c4d0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1c4e0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1c4f0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1c500 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c510 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c520 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c530 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1c550 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1c560 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c570 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1c580 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1c590 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c5a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c5b0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1c5c0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
1c5d0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1c5e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c5f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c600 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1c610 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
1c620 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1c630 61 67 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  age;.  if( CURSO
1c640 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1c650 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1c660 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1c670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c680 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1c690 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43  skip>0 ){.    pC
1c6a0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1c6b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1c6c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c6d0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1c6e0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  kip = 0;..  asse
1c6f0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1c700 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1c710 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
1c720 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
1c730 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d  ->idx++;.  pCur-
1c740 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c750 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
1c760 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1c770 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1c780 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1c790 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1c7a0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
1c7b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c7c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c7d0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
1c7e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1c7f0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1c800 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1c810 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1c820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1c840 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c850 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1c860 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1c870 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1c880 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1c890 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1c8a0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
1c8b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1c8d0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1c8e0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1c8f0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1c900 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
1c910 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  le( pCur->idx>=p
1c920 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c930 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c940 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1c950 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  fData ){.      r
1c960 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c970 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1c980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c9a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
1c9b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
1c9c0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
1c9d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c9e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c9f0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
1ca00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1ca10 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
1ca20 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
1ca30 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
1ca40 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1ca50 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1ca60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ca70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ca80 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4e  );.  rc = btreeN
1ca90 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1caa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cab0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
1cac0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
1cad0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
1cae0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
1caf0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1cb00 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1cb10 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1cb20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1cb30 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1cb40 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
1cb50 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1cb60 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
1cb70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1cb80 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
1cb90 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
1cba0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1cbb0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
1cbc0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1cbd0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1cbe0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d    Pgno pgno;.  M
1cbf0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1cc00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1cc10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1cc20 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1cc30 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
1cc40 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1cc50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cc60 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1cc70 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43   rc;.  }.  if( C
1cc80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1cc90 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1cca0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ccb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ccc0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1ccd0 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
1cce0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1ccf0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1cd00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cd10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1cd20 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1cd30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1cd40 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1cd50 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1cd60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1cd70 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  idx>=0 );.  if( 
1cd80 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1cd90 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1cda0 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50  yte( findCell(pP
1cdb0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1cdc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1cdd0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1cde0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
1cdf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ce00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1ce10 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1ce20 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
1ce30 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
1ce40 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20  ur->idx==0 ){.  
1ce50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
1ce60 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
1ce70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1ce80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1ce90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1cea0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1ceb0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1cec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ced0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cee0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1cef0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1cf00 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1cf10 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Page;.    }.    
1cf20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20  pCur->idx--;.   
1cf30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1cf40 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1cf50 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1cf60 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1cf70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1cf80 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1cf90 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1cfa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cfb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cfc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1cfd0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1cfe0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1cff0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
1d000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1d010 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1d020 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
1d030 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d040 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1d050 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
1d060 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 72 65 74  ur, pRes);.  ret
1d070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d080 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1d090 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1d0a0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1d0b0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1d0c0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1d0d0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1d0e0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1d0f0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1d100 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1d110 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1d120 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1d130 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1d140 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1d150 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1d160 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1d170 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1d180 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1d190 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1d1a0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1d1b0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1d1c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d1d0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1d1e0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1d1f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1d200 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1d210 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1d220 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1d230 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1d240 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1d250 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1d260 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d270 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1d280 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1d290 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1d2a0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1d2b0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1d2c0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1d2d0 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1d2e0 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1d2f0 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1d300 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1d310 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1d320 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1d330 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1d340 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1d350 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1d360 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1d370 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1d380 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1d390 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1d3a0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1d3b0 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1d3c0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1d3d0 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1d3e0 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1d3f0 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1d400 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1d410 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1d420 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1d430 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1d440 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1d450 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1d460 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1d470 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1d480 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1d490 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1d4a0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
1d4b0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1d4c0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1d4d0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1d4e0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1d4f0 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1d500 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1d510 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1d520 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1d530 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1d540 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1d550 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1d560 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1d570 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1d580 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1d590 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1d5a0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1d5b0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1d5c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d5d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d5e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d5f0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1d600 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1d610 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d620 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1d630 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1d640 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1d650 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1d660 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1d670 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1d680 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1d690 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
1d6a0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
1d6b0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
1d6c0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
1d6d0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
1d6e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
1d6f0 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
1d700 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
1d710 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
1d720 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
1d730 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
1d740 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
1d750 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
1d760 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
1d770 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
1d780 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
1d790 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
1d7a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
1d7b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d7c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1d7d0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
1d7e0 72 62 79 3c 3d 73 71 6c 69 74 65 33 50 61 67 65  rby<=sqlite3Page
1d7f0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1d800 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1d810 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
1d820 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
1d830 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1d840 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1d850 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
1d860 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1d870 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
1d880 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1d890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d8a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d8b0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1d8c0 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
1d8d0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
1d8e0 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
1d8f0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
1d900 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
1d910 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1d920 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
1d930 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
1d940 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1d950 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
1d960 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
1d970 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
1d980 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
1d990 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1d9a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d9b0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1d9c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d9d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1d9e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1d9f0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
1da00 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1da10 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
1da20 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
1da30 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
1da40 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
1da50 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
1da60 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
1da70 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
1da80 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
1da90 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
1daa0 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
1dab0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1dac0 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
1dad0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
1dae0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
1daf0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
1db00 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
1db10 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1db20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
1db30 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1db40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1db50 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1db60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1db70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
1db80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1db90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1dba0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
1dbb0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
1dbc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1dbd0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1dbe0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
1dbf0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1dc00 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
1dc10 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
1dc20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1dc30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
1dc40 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
1dc50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
1dc60 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
1dc70 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
1dc80 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
1dc90 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
1dca0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
1dcb0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
1dcc0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
1dcd0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
1dce0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
1dcf0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
1dd00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1dd10 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
1dd20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dd30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dd40 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1dd50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1dd60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1dd70 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1dd80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1dd90 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
1dda0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
1ddb0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1ddc0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1ddd0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1dde0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1ddf0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1de00 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1de10 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1de20 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1de30 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1de40 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1de50 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1de60 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
1de70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1de80 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   8 ){.        /*
1de90 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
1dea0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
1deb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1dec0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
1ded0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1dee0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1def0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1df00 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
1df10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1df20 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
1df30 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
1df40 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
1df50 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
1df60 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
1df70 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
1df80 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
1df90 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
1dfa0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
1dfb0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
1dfc0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
1dfd0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
1dfe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1dff0 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
1e000 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
1e010 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1e020 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1e030 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e050 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e070 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e080 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e090 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e0b0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
1e0c0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1e0d0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1e0e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1e0f0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1e100 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1e110 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e130 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
1e140 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e150 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e160 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e170 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e180 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e190 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
1e1a0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1e1b0 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
1e1c0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
1e1d0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
1e1e0 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
1e1f0 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
1e200 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
1e210 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
1e220 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1e230 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1e240 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
1e250 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
1e260 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
1e270 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
1e280 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1e290 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
1e2a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e2b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e2c0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1e2d0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1e2e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e2f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e300 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e310 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e340 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1e350 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1e360 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e380 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1e390 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1e3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1e3b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e3c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e3d0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1e3e0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1e3f0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1e400 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1e410 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e420 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1e430 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1e440 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e450 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1e460 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1e470 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1e480 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1e490 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1e4a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1e4b0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1e4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e4d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e4e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
1e4f0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1e500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e520 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
1e530 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
1e540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e550 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e560 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e570 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e590 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e5a0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1e5b0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
1e5c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
1e5d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e5e0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1e5f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e600 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1e610 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1e620 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1e630 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1e640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e650 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1e660 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1e670 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1e680 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1e690 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1e6a0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1e6b0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1e6c0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1e6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e6e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e6f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e700 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1e720 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e730 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1e740 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
1e750 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
1e760 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
1e770 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1e780 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
1e790 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1e7a0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
1e7b0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
1e7c0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
1e7d0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
1e7e0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
1e7f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1e800 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
1e810 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
1e820 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
1e830 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1e840 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
1e850 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1e860 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
1e870 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1e880 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
1e890 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
1e8a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e8d0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1e8e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1e8f0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
1e900 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
1e910 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
1e920 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
1e930 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
1e940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
1e950 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1e960 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67          if( *pPg
1e970 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1e980 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1e990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1e9a0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1e9b0 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1e9c0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1e9d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e9e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e9f0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1ea00 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1ea10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1ea20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1ea30 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1ea60 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1ea70 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1ea80 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1ea90 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1eaa0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1eab0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1eac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1ead0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1eae0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1eaf0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1eb00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eb10 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1eb20 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1eb30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1eb40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1eb50 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1eb60 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Page, 1);.      
1eb70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1eb90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1eba0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a  rDontRollback((*
1ebb0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1ebc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1ebd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ebe0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
1ebf0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ec00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1ec10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1ec30 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ec50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec60 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1ec70 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ec80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
1ec90 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1eca0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
1ecb0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
1ecc0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
1ecd0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1ece0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1ecf0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1ed00 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1ed10 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1ed20 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1ed30 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1ed40 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69     *pPgno = sqli
1ed50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1ed60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b  t(pBt->pPager) +
1ed70 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
1ed80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ed90 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1eda0 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
1edb0 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75   /* An incr-vacu
1edc0 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  um has already r
1edd0 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  un within this t
1ede0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74  ransaction. So t
1edf0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
1ee00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20   to allocate is 
1ee10 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79  not from the phy
1ee20 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65  sical end of the
1ee30 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20   file, but.     
1ee40 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75   ** at pBt->nTru
1ee50 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nc. .      */.  
1ee60 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
1ee70 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20  ->nTrunc+1;.    
1ee80 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
1ee90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1eea0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
1eeb0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
1eec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1eed0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1eee0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
1eef0 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
1ef00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
1ef10 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
1ef20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1ef30 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
1ef40 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
1ef50 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
1ef60 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
1ef70 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
1ef80 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
1ef90 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
1efa0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
1efb0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
1efc0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
1efd0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
1efe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52       */.      TR
1eff0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1f000 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1f010 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
1f020 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
1f030 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
1f040 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1f050 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f060 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) );.      (*pPg
1f070 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  no)++;.      if(
1f080 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1f090 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f0a0 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d  ){ (*pPgno)++; }
1f0b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f0c0 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20  Bt->nTrunc ){.  
1f0d0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
1f0e0 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a  = *pPgno;.    }.
1f0f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
1f100 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1f110 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f120 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  t) );.    rc = s
1f130 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f140 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1f150 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
1f160 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f170 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1f180 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
1f190 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1f1a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1f1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f1c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1f1d0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
1f1e0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1f1f0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1f200 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
1f210 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
1f220 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1f230 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f240 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
1f250 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
1f260 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1f270 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1f280 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1f290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f2a0 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
1f2b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f2c0 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
1f2d0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
1f2e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
1f2f0 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
1f300 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
1f310 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
1f320 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1f330 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f340 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1f350 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1f360 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1f370 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
1f380 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
1f390 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
1f3a0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  g */.  assert( s
1f3b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f3c0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1f3d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f3e0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
1f3f0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
1f400 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  it = 0;.  releas
1f410 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61  ePage(pPage->pPa
1f420 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  rent);.  pPage->
1f430 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  pParent = 0;..  
1f440 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1f450 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
1f460 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
1f470 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f480 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1f490 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1f4a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f4b0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
1f4c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f4d0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
1f4e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f4f0 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
1f500 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1f510 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
1f520 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1f530 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
1f540 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
1f550 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
1f560 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
1f570 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
1f580 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
1f590 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
1f5a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f5b0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1f5c0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1f5d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
1f5e0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
1f5f0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
1f600 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
1f610 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1f620 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f630 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  UUM.  /* If the 
1f640 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
1f650 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
1f660 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
1f670 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1f680 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
1f690 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
1f6a0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
1f6b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f6c0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1f6d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
1f6e0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  Page->pgno, PTRM
1f6f0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
1f700 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f710 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1f720 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20  dif..  if( n==0 
1f730 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
1f740 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  s the first free
1f750 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20   page */.    rc 
1f760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f770 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1f780 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1f790 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f7a0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
1f7b0 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20  Data, 0, 8);.   
1f7c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f7d0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50  1->aData[32], pP
1f7e0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1f7f0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
1f800 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20  E: %d first\n", 
1f810 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
1f820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1f830 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20  ther free pages 
1f840 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20  already exist.  
1f850 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73  Retrive the firs
1f860 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
1f870 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c   ** of the freel
1f880 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74  ist and find out
1f890 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73   how many leaves
1f8a0 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20   it has. */.    
1f8b0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b  MemPage *pTrunk;
1f8c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f8d0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1f8e0 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
1f8f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
1f900 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1f910 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f920 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65  n rc;.    k = ge
1f930 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1f940 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69  aData[4]);.    i
1f950 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c  f( k>=pBt->usabl
1f960 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1f970 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1f980 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e  k is full.  Turn
1f990 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
1f9a0 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77  freed into a new
1f9b0 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20  .      ** trunk 
1f9c0 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61  page with no lea
1f9d0 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ves. */.      rc
1f9e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f9f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1fa00 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1fa10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fa20 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fa30 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1fa40 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20  pTrunk->pgno);. 
1fa50 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1fa60 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
1fa70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
1fa80 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1fa90 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1faa0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1fab0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1fac0 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
1fad0 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
1fae0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1faf0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
1fb00 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  no, pTrunk->pgno
1fb10 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1fb20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20 29 7b  }else if( k<0 ){
1fb30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1fb40 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
1fb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1fb60 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72  Add the newly fr
1fb70 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65  eed page as a le
1fb80 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  af on the curren
1fb90 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  t trunk */.     
1fba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fbb0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1fbc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fbd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fbe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
1fbf0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1fc00 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20  Data[4], k+1);. 
1fc10 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1fc20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1fc30 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67  +k*4], pPage->pg
1fc40 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
1fc50 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1fc60 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  E.        sqlite
1fc70 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1fc80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1fc90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
1fca0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1fcb0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
1fcc0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
1fcd0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
1fce0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
1fcf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
1fd00 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
1fd10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
1fd30 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
1fd40 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1fd50 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
1fd60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fd70 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
1fd80 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
1fd90 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
1fda0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1fdb0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1fdc0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1fdd0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
1fde0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1fdf0 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76   nOvfl;.  int ov
1fe00 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
1fe10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1fe20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1fe30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1fe40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
1fe50 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1fe60 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1fe70 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
1fe80 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
1fe90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fea0 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
1feb0 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
1fec0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1fed0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
1fee0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
1fef0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
1ff00 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f  iOverflow]);.  o
1ff10 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
1ff20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1ff30 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
1ff40 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
1ff50 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
1ff60 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
1ff70 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
1ff80 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
1ff90 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
1ffa0 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
1ffb0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1ffc0 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  *pOvfl;.    if( 
1ffd0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f  ovflPgno==0 || o
1ffe0 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50  vflPgno>sqlite3P
1fff0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
20000 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
20010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20020 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20030 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
20040 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
20050 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
20060 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30  pOvfl, (nOvfl==0
20070 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a  )?0:&ovflPgno);.
20080 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20090 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
200a0 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
200b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
200c0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
200d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
200e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
200f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20110 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
20120 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
20130 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
20140 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
20150 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
20160 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
20170 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
20180 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
20190 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
201a0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
201b0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
201c0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
201d0 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
201e0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
201f0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
20200 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
20210 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
20220 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
20230 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
20240 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
20250 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
20260 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
20270 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
20280 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
20290 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
202a0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
202b0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
202c0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
202d0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
202e0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
202f0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
20300 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
20310 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
20320 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
20330 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
20340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20350 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
20360 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
20370 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
20380 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
20390 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
203a0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
203b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
203c0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
203d0 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
203e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
203f0 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
20400 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
20410 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20430 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
20440 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
20450 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
20460 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
20470 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20480 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
20490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
204a0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
204b0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
204c0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
204d0 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
204e0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
204f0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
20500 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
20510 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
20520 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
20530 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
20540 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20550 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
20560 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
20570 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
20580 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
20590 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
205a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
205b0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
205c0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
205d0 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
205e0 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
205f0 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
20600 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
20610 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
20620 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
20630 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
20640 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
20650 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
20660 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
20670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
20680 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
20690 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
206a0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
206b0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
206c0 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
206d0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
206e0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
206f0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
20700 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
20710 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
20720 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
20730 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
20740 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
20750 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29  a==nData+nZero )
20760 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
20770 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
20780 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
20790 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
207a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
207b0 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
207c0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
207d0 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
207e0 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
207f0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
20800 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
20810 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
20820 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
20830 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
20840 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
20850 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
20860 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
20870 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
20880 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
20890 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
208a0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
208b0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
208c0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
208d0 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63        int isExac
208e0 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  t = 0;.#ifndef S
208f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20900 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
20910 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
20920 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
20930 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
20940 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
20950 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
20960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20970 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
20980 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
20990 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
209a0 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
209b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
209c0 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
209d0 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
209e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
209f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20a00 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e     if( pgnoOvfl>
20a10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
20a20 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a  * isExact = 1; *
20a30 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
20a40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20a50 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
20a60 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
20a70 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
20a80 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63  pgnoOvfl, isExac
20a90 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
20aa0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20ab0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
20ac0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
20ad0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
20ae0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
20af0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
20b00 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
20b10 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
20b20 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
20b30 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
20b40 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
20b50 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
20b60 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
20b70 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
20b80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
20b90 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
20ba0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
20bb0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
20bc0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
20bd0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
20be0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
20bf0 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
20c00 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
20c10 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
20c20 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
20c30 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
20c40 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
20c50 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
20c60 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
20c70 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
20c80 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
20c90 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
20ca0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20cb0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
20cc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
20cd0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
20ce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20cf0 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
20d00 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
20d10 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
20d20 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
20d30 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
20d40 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
20d50 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
20d60 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
20d70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
20d80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20d90 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
20da0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
20db0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
20dc0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
20dd0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
20de0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20df0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20e00 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
20e10 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
20e20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20e30 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
20e40 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
20e50 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
20e60 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
20e70 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
20e80 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
20e90 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
20ea0 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
20eb0 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
20ec0 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
20ed0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
20ee0 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
20ef0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
20f00 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
20f10 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e  eLeft;.    if( n
20f20 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
20f30 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
20f40 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
20f50 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
20f60 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
20f70 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
20f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
20f90 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
20fa0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
20fb0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
20fc0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
20fd0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
20fe0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
20ff0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
21000 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
21010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
21020 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
21030 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
21040 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
21050 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
21060 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
21070 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21080 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50   Change the MemP
21090 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e  age.pParent poin
210a0 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ter on the page 
210b0 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a  whose number is.
210c0 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ** given in the 
210d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
210e0 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e  so that MemPage.
210f0 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68  pParent holds th
21100 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20  e.** pointer in 
21110 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
21120 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
21130 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42  t reparentPage(B
21140 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
21150 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65  no pgno, MemPage
21160 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e   *pNewParent, in
21170 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67  t idx){.  MemPag
21180 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61  e *pThis;.  DbPa
21190 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
211a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
211b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
211c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
211d0 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d  rt( pNewParent!=
211e0 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  0 );.  if( pgno=
211f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
21200 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
21210 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20   pBt->pPager!=0 
21220 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
21230 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
21240 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
21250 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
21260 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73  age ){.    pThis
21270 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
21280 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
21290 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ra(pDbPage);.   
212a0 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e   if( pThis->isIn
212b0 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  it ){.      asse
212c0 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61  rt( pThis->aData
212d0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
212e0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
212f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
21300 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77  s->pParent!=pNew
21310 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
21320 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
21330 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61  rent ) sqlite3Pa
21340 67 65 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e  gerUnref(pThis->
21350 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
21360 29 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73  );.        pThis
21370 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77  ->pParent = pNew
21380 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  Parent;.        
21390 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
213a0 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50  pNewParent->pDbP
213b0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
213c0 20 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61      pThis->idxPa
213d0 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20  rent = idx;.    
213e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
213f0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
21400 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
21410 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21420 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
21430 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
21440 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
21450 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50  Put(pBt, pgno, P
21460 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
21470 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  wParent->pgno);.
21480 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
21490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
214a0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  ..../*.** Change
214b0 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
214c0 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c  nter of all chil
214d0 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f  dren of pPage to
214e0 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74   point back.** t
214f0 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  o pPage..**.** I
21500 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66  n other words, f
21510 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f  or every child o
21520 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20  f pPage, invoke 
21530 72 65 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a  reparentPage().*
21540 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
21550 68 61 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b  hat each child k
21560 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67 65 20  nows that pPage 
21570 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a  is its parent..*
21580 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21590 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66  e gets called af
215a0 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29  ter you memcpy()
215b0 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a   one page into.*
215c0 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74  * another..*/.st
215d0 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
215e0 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50  tChildPages(MemP
215f0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
21600 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64  nt i;.  BtShared
21610 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
21620 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
21630 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
21640 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21650 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21660 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
21670 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
21680 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21690 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
216a0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
216b0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
216c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
216d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 72 63  Page, i);.    rc
216e0 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
216f0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
21700 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
21710 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21720 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21730 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  rc;.  }.  rc = r
21740 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
21750 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21760 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
21770 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20     pPage, i);.  
217a0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
217b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
217c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
217d0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
217e0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
217f0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
21800 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
21810 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
21820 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
21830 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
21840 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
21850 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
21860 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
21870 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
21880 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
21890 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
218a0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
218b0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
218c0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
218d0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
218e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
218f0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
21900 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
21910 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
21920 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
21930 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69  int sz){.  int i
21940 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
21950 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21960 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
21970 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
21980 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
21990 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
219a0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
219b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
219c0 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
219d0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
219e0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
219f0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
21a00 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
21a10 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
21a20 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
21a30 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
21a40 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
21a50 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
21a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
21a70 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
21a80 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
21a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21aa0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
21ab0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21ac0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
21ad0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
21ae0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
21af0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
21b00 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
21b10 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
21b20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
21b30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
21b40 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
21b50 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
21b60 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
21b70 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
21b80 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
21b90 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
21ba0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
21bb0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
21bc0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
21bd0 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
21be0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21bf0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
21c00 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
21c10 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
21c20 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
21c30 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
21c40 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
21c50 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
21c60 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
21c70 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
21c80 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
21c90 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
21ca0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21cb0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
21cc0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
21cd0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
21ce0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
21cf0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
21d00 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
21d10 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
21d20 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
21d30 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
21d40 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
21d50 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
21d60 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
21d70 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
21d80 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
21d90 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21da0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
21db0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
21dc0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
21dd0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
21de0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
21df0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
21e00 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
21e10 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
21e20 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
21e30 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
21e40 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
21e50 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
21e60 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
21e70 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
21e80 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
21e90 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
21ea0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
21eb0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
21ec0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
21ed0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
21ee0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
21ef0 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
21f00 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
21f10 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
21f20 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
21f30 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
21f40 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
21f50 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
21f60 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
21f70 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
21f80 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
21f90 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
21fa0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
21fb0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
21fc0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
21fd0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
21fe0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
21ff0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
22000 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
22010 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
22020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
22030 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
22040 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
22050 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
22060 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
22070 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
22080 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
22090 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
220a0 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
220b0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
220c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
220d0 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
220e0 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
220f0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
22100 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
22110 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22120 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
22130 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22140 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
22150 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22160 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
22170 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
22180 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22190 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
221a0 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
221b0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
221c0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
221d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
221e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
221f0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
22200 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
22210 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
22220 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
22230 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
22240 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
22250 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
22260 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
22270 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
22280 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
22290 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
222a0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
222b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
222c0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
222d0 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
222e0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
222f0 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
22300 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
22310 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
22320 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
22330 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
22340 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
22350 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
22360 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
22370 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
223a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
223b0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
223c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
223d0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
223e0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
223f0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
22400 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
22410 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
22420 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
22430 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
22440 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
22450 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
22460 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73  .    assert( j<s
22470 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
22480 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
22490 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20  ->aOvfl[0]) );. 
224a0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
224b0 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
224c0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
224d0 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20  fl[j].idx = i;. 
224e0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
224f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
22500 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
22510 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
22520 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
22530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
22550 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22570 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22580 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
22590 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
225a0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
225b0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
225c0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
225d0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
225e0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
225f0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
22600 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
22610 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
22620 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
22630 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
22640 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
22650 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
22660 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
22670 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72  .      rc = defr
22680 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
22690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
226a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
226b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f  urn rc;.      to
226c0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
226d0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
226e0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
226f0 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
22700 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
22710 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
22720 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
22730 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
22740 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
22750 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22760 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
22770 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
22780 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
22790 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
227a0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
227b0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
227c0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
227d0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
227e0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
227f0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
22800 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
22810 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
22820 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
22830 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
22840 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
22850 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
22860 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
22870 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
22880 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
22890 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
228a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
228b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
228c0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
228d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
228e0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
228f0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
22900 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
22910 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
22920 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
22930 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
22940 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
22950 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
22960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
22970 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
22980 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22990 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
229a0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
229b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
229c0 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
229d0 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
229e0 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
229f0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
22a00 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
22a10 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
22a20 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
22a30 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
22a40 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
22a50 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
22a60 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
22a70 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
22a80 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
22a90 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
22aa0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
22ab0 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
22ac0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
22ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22af0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
22b00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
22b10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22b20 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
22b30 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
22b40 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
22b50 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
22b60 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
22b70 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
22b80 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
22b90 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
22ba0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
22bb0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
22bc0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
22bd0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
22be0 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
22bf0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
22c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
22c10 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
22c20 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
22c30 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
22c40 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
22c50 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
22c60 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
22c70 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
22c80 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
22c90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
22ca0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22cb0 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69  */.  int totalSi
22cc0 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  ze;    /* Total 
22cd0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
22ce0 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  s */.  int hdr; 
22cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22d00 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  x of page header
22d10 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74   */.  int cellpt
22d20 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  r;      /* Addre
22d30 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
22d40 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
22d50 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
22d60 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
22d70 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
22d80 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
22d90 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
22da0 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  he page */..  as
22db0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
22dc0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
22dd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22de0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
22df0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
22e00 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b    totalSize = 0;
22e10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
22e20 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  ell; i++){.    t
22e30 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a  otalSize += aSiz
22e40 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
22e50 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a  rt( totalSize+2*
22e60 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46  nCell<=pPage->nF
22e70 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ree );.  assert(
22e80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
22e90 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20   );.  cellptr = 
22ea0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
22eb0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
22ec0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
22ed0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
22ee0 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  et;.  put2byte(&
22ef0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
22f00 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ll);.  if( nCell
22f10 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   ){.    cellbody
22f20 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
22f30 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a  (pPage, totalSiz
22f40 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
22f50 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20  cellbody>0 );.  
22f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22f70 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c  >nFree >= 2*nCel
22f80 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l );.    pPage->
22f90 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c  nFree -= 2*nCell
22fa0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22fb0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
22fc0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
22fd0 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
22fe0 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65  lbody);.      me
22ff0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
23000 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
23010 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20   aSize[i]);.    
23020 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a    cellptr += 2;.
23030 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b        cellbody +
23040 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
23050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  }.    assert( ce
23060 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70  llbody==pPage->p
23070 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
23080 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
23090 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a  Cell = nCell;.}.
230a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
230b0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
230c0 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
230d0 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
230e0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
230f0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
23100 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
23110 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
23120 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
23130 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
23140 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
23150 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
23160 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
23170 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
23180 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
23190 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
231a0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
231b0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
231c0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
231d0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
231e0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
231f0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
23200 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
23210 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
23220 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
23230 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
23240 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
23250 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
23260 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
23270 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
23280 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
23290 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
232a0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
232b0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
232c0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
232d0 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
232e0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
232f0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
23300 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
23310 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
23320 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
23330 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23340 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
23350 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
23360 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
23370 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
23380 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
23390 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
233a0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
233b0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
233c0 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a  MemPage*, int);.
233d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
233e0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
233f0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
23400 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
23410 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
23420 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
23430 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
23440 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
23450 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
23460 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
23470 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
23480 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
23490 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
234a0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
234b0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
234c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
234d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
234e0 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
234f0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
23500 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
23510 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
23520 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
23530 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
23540 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
23550 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
23560 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
23570 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
23580 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
23590 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
235a0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
235b0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
235c0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
235d0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
235e0 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
235f0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
23600 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
23610 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
23620 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
23630 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
23640 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
23650 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
23660 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
23670 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
23680 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
23690 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
236a0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
236b0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
236c0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
236d0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
236e0 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
236f0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
23700 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
23710 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
23720 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
23730 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
23740 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
23750 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
23760 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
23770 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  u16 szCell;.  Ce
23780 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
23790 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
237a0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
237b0 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
237c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
237d0 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
237e0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
237f0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
23800 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
23810 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23820 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
23830 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
23840 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
23850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
23860 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
23870 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
23880 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23890 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
238a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
238b0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
238c0 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
238d0 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
238e0 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
238f0 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
23900 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
23910 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
23920 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
23930 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
23940 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
23950 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
23960 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
23970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23980 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23990 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
239a0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
239b0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  .  szCell = cell
239c0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
239d0 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67  Cell);.  zeroPag
239e0 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
239f0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65  Data[0]);.  asse
23a00 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
23a10 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
23a20 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  l);.  pPage->nOv
23a30 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f  erflow = 0;..  /
23a40 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74  * Set the parent
23a50 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c   of the newly al
23a60 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20  located page to 
23a70 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e  pParent. */.  pN
23a80 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
23a90 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
23aa0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
23ab0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
23ac0 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
23ad0 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
23ae0 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
23af0 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
23b00 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
23b10 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
23b20 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
23b30 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
23b40 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
23b50 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
23b60 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ild. .  */.  ass
23b70 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
23b80 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d  l>0 );.  pCell =
23b90 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
23ba0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
23bb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
23bc0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
23bd0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
23be0 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  );.  rc = fillIn
23bf0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61  Cell(pParent, pa
23c00 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  rentCell, 0, inf
23c10 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
23c20 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
23c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23c40 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23c50 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
23c60 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
23c70 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72   );.  rc = inser
23c80 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
23c90 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
23ca0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
23cb0 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72  , 0, 4);.  if( r
23cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23cd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23ce0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69   }.  put4byte(fi
23cf0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
23d00 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
23d10 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
23d20 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
23d30 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
23d40 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
23d50 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
23d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23d70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
23d80 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
23d90 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
23da0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
23db0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
23dc0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
23dd0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
23de0 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
23df0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
23e00 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
23e10 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
23e20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
23e30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
23e40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
23e50 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
23e60 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
23e70 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
23e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
23e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ea0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
23eb0 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
23ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
23ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23ee0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23ef0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
23f00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23f10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
23f20 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
23f30 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
23f40 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  page and balance
23f50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
23f60 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  ,.  ** in case t
23f70 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
23f80 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
23f90 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
23fa0 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  rfull..  */.  re
23fb0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
23fc0 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63  .  return balanc
23fd0 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d  e(pParent, 0);.}
23fe0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23ff0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
24000 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
24010 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
24020 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
24030 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
24040 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
24050 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
24060 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
24070 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
24080 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
24090 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
240a0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
240b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
240c0 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
240d0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
240e0 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
240f0 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
24100 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
24110 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
24120 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
24130 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
24140 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
24150 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
24160 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
24170 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
24180 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
24190 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
241a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
241b0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
241c0 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
241d0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
241e0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
241f0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
24200 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
24210 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
24220 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
24230 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
24240 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
24250 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
24260 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
24270 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
24280 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
24290 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
242a0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
242b0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
242c0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
242d0 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
242e0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
242f0 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
24300 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
24310 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
24320 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
24330 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
24340 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
24350 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
24360 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
24370 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
24380 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
24390 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
243a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
243b0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
243c0 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
243d0 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
243e0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
243f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
24400 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
24410 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
24420 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
24430 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
24440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24450 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
24460 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
24470 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
24480 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
24490 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
244a0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
244b0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
244c0 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
244d0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
244e0 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
244f0 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
24500 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
24510 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
24520 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
24530 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
24540 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
24550 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
24560 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
24570 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
24580 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
24590 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
245a0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
245b0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
245c0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
245d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
245e0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
245f0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
24600 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
24610 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  nroot(MemPage *p
24620 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
24630 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
24640 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
24650 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ent of pPage */.
24660 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24680 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
24690 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
246a0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
246b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
246c0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
246d0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
246e0 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
246f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
24700 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
24710 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
24720 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
24730 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
24740 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24750 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
24760 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
24770 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24790 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
247a0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
247b0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
247c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
247d0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
247e0 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
247f0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
24800 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
24810 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
24820 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
24840 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
24850 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
24860 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
24890 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
248a0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
248b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
248c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
248d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
248e0 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
248f0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
24900 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
24910 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
24920 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
24930 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
24940 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24950 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
24960 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
24970 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
24980 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
24990 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
249a0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
249b0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
249c0 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
249e0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
249f0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
24a00 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
24a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
24a20 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
24a30 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
24a40 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
24a50 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
24a60 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
24a70 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
24a80 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pace[] */.  MemP
24a90 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
24aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
24ab0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
24ac0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
24ad0 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
24ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24af0 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
24b00 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
24b10 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
24b20 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
24b30 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
24b40 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
24b50 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
24b60 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
24b70 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
24b80 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
24b90 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
24ba0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
24bb0 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
24bc0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
24bd0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
24be0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
24bf0 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
24c00 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
24c10 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
24c20 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
24c30 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
24c40 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
24c50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
24c60 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
24c70 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
24c80 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
24c90 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
24ca0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
24cb0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
24cc0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
24cd0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
24ce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
24cf0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
24d00 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
24d10 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
24d40 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
24d50 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
24d60 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
24d70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24d80 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
24d90 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
24da0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20  /.  u8 *aSpace; 
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
24dd0 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  d copies of divi
24de0 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69  ders cells */.#i
24df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24e00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
24e10 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
24e20 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24e30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24e40 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
24e50 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a  utex) );..  /* .
24e60 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
24e70 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
24e80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24e90 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24ea0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
24eb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
24ec0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
24ed0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
24ee0 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
24ef0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
24f00 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
24f10 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
24f20 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
24f30 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
24f40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24f50 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
24f60 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
24f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24f80 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
24f90 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
24fa0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
24fb0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
24fc0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
24fd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24fe0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
24ff0 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
25000 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
25010 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
25020 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
25030 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
25040 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
25050 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
25060 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
25070 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
25080 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
25090 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
250a0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
250b0 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
250c0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
250d0 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
250e0 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
250f0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
25100 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
25110 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
25120 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
25130 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
25140 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
25150 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
25160 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
25170 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
25180 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
25190 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
251a0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
251b0 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
251c0 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
251d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
251e0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
251f0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
25200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
25210 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
25220 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
25230 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
25240 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
25250 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
25260 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
25270 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
25280 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
25290 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
252a0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
252b0 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
252c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
252d0 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
252e0 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
252f0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
25300 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
25310 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
25320 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
25330 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51  #endif..  if( SQ
25340 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
25350 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25360 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25370 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25380 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  rc;.  }..  /*.  
25390 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
253a0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
253b0 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
253c0 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
253d0 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
253e0 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
253f0 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
25400 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
25410 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
25420 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
25430 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
25440 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
25450 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
25460 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
25470 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a  nt->idxShift ){.
25480 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
25490 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d     pgno = pPage-
254a0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
254b0 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  t( pgno==sqlite3
254c0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
254d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
254e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
254f0 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
25500 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
25510 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
25520 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
25530 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
25540 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
25550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25560 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
25570 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
25580 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
25590 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
255a0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
255b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
255c0 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
255d0 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
255e0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
255f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
25600 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
25610 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
25620 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
25630 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
25640 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
25650 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
25660 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
25670 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
25680 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
25690 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
256a0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
256b0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
256c0 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
256d0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
256e0 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
256f0 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
25700 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
25710 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
25720 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
25730 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
25740 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
25750 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
25760 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
25770 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
25780 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
25790 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
257a0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
257b0 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
257c0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
257d0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
257e0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
257f0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
25800 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
25810 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
25820 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
25830 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
25840 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
25850 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
25860 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
25870 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
25880 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
25890 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
258a0 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
258b0 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
258c0 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
258d0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
258e0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
258f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
25900 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
25910 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
25920 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
25930 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
25940 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
25950 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
25960 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
25970 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
25980 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
25990 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
259a0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
259b0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
259c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
259d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
259e0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
259f0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
25a00 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
25a10 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
25a20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
25a30 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
25a40 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
25a50 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
25a60 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
25a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
25a80 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
25a90 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
25aa0 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
25ab0 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
25ac0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
25ad0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
25ae0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
25af0 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
25b00 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
25b10 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
25b20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
25b30 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
25b40 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
25b50 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
25b60 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
25b70 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
25b80 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ll = sqlite3_mal
25b90 6c 6f 63 28 20 0a 20 20 20 20 20 20 20 6e 4d 61  loc( .       nMa
25ba0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
25bb0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
25bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
25bd0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
25be0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
25bf0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
25c00 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
25c10 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f  ll */.     + (RO
25c20 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
25c30 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53  age))+pBt->pageS
25c40 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70  ize)*NB  /* aCop
25c50 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  y */.     + pBt-
25c60 3e 70 61 67 65 53 69 7a 65 2a 35 20 20 20 20 20  >pageSize*5     
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
25c90 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  e */.     + (ISA
25ca0 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
25cb0 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20  Cells : 0)      
25cc0 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
25cd0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61   */.  );.  if( a
25ce0 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
25cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25d00 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
25d10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
25d20 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
25d30 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
25d40 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d  lls];.  aCopy[0]
25d50 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
25d60 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
25d70 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d  sert( ((aCopy[0]
25d80 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
25d90 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
25da0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
25db0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72  equired */.  for
25dc0 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29  (i=1; i<NB; i++)
25dd0 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d  {.    aCopy[i] =
25de0 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74   &aCopy[i-1][pBt
25df0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
25e00 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
25e10 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ))];.    assert(
25e20 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75   ((aCopy[i] - (u
25e30 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
25e40 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
25e50 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
25e60 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61  ed */.  }.  aSpa
25e70 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  ce = &aCopy[NB-1
25e80 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
25e90 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
25ea0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
25eb0 72 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28  rt( ((aSpace - (
25ec0 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
25ed0 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
25ee0 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
25ef0 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  red */.#ifndef S
25f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25f10 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
25f20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
25f30 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
25f40 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69  ce[5*pBt->pageSi
25f50 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ze];.  }.#endif.
25f60 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
25f70 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
25f80 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
25f90 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
25fa0 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
25fb0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
25fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
25fd0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
25fe0 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
25ff0 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
26000 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
26010 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
26020 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
26030 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
26040 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
26050 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
26060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
26070 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
26080 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
26090 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
260a0 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65  aCopy[i];.    me
260b0 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d  mcpy(p, apOld[i]
260c0 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  , sizeof(MemPage
260d0 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ));.    p->aData
260e0 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b   = (void*)&p[1];
260f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
26100 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
26110 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
26120 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
26130 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
26140 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
26150 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
26160 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
26170 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
26180 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
26190 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
261a0 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
261b0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
261c0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
261d0 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61  tained form aSpa
261e0 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  ce[] and remove 
261f0 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20  the the divider 
26200 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  Cells.  ** from 
26210 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
26220 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
26230 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
26240 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
26250 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
26260 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
26270 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
26280 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
26290 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
262a0 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
262b0 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20  into aSpace[].  
262c0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
262d0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
262e0 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
262f0 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
26300 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
26310 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
26320 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
26330 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
26340 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
26350 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
26360 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
26370 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
26380 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
26390 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
263a0 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
263b0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
263c0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
263d0 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
263e0 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
263f0 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
26400 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
26410 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
26420 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c  ys..  */.  nCell
26430 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72   = 0;.  leafCorr
26440 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e  ection = pPage->
26450 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
26460 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
26470 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c  Data && pPage->l
26480 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  eaf;.  for(i=0; 
26490 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
264a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
264b0 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  = apCopy[i];.   
264c0 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c   int limit = pOl
264d0 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e  d->nCell+pOld->n
264e0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f  Overflow;.    fo
264f0 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
26500 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  j++){.      asse
26510 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
26520 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43  lls );.      apC
26530 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
26540 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f  dOverflowCell(pO
26550 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a  ld, j);.      sz
26560 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65  Cell[nCell] = ce
26570 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20  llSizePtr(pOld, 
26580 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a  apCell[nCell]);.
26590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
265a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
265b0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
265c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
265d0 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20      int a;.     
265e0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
265f0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = i;.        for
26600 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f  (a=0; a<pOld->nO
26610 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20  verflow; a++){. 
26620 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c           if( pOl
26630 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c  d->aOvfl[a].pCel
26640 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  l==apCell[nCell]
26650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26660 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
26670 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xFF;.           
26680 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26690 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
266a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
266b0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
266c0 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
266d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  -1 ){.      u16 
266e0 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
266f0 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
26700 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  i]);.      if( l
26710 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
26720 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c     /* With the L
26730 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50  EAFDATA flag, pP
26740 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64  arent cells hold
26750 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68   only INTKEYs th
26760 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  at.        ** ar
26770 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
26780 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c  keys on the chil
26790 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65  d pages.  We nee
267a0 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20  d to remove.    
267b0 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64      ** the divid
267c0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50  er cells from pP
267d0 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64  arent, but the d
267e0 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72  ividers cells ar
267f0 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
26800 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c   added to apCell
26810 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20  [] because they 
26820 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
26830 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20  f child cells.. 
26840 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26850 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
26860 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
26870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26880 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
26890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
268a0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
268b0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
268c0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20  l[nCell] = sz;. 
268d0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26         pTemp = &
268e0 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
268f0 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b          iSpace +
26900 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
26910 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42  sert( iSpace<=pB
26920 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b  t->pageSize*5 );
26930 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
26940 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
26950 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70   sz);.        ap
26960 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
26970 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
26980 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  on;.#ifndef SQLI
26990 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
269a0 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  UM.        if( p
269b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
269c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f  {.          aFro
269d0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
269e0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
269f0 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  f.        dropCe
26a00 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26a10 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  v, sz);.        
26a20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
26a30 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
26a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26a50 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29   get4byte(pTemp)
26a60 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a  ==pgnoOld[i] );.
26a70 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c          if( !pOl
26a80 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
26a90 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
26aa0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
26ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
26ac0 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
26ad0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
26ae0 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
26af0 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
26b00 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
26b10 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
26b20 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  l */.          m
26b30 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
26b40 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
26b50 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  a[pOld->hdrOffse
26b60 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  t+8], 4);.      
26b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26b80 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
26b90 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
26ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a            if( sz
26bb0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
26bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
26bd0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
26be0 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
26bf0 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
26c00 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65              szCe
26c10 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
26c20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65     }.        nCe
26c40 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ll++;.      }.  
26c50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
26c60 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
26c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
26c80 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
26c90 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
26ca0 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
26cb0 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
26cc0 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
26cd0 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
26ce0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
26cf0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
26d00 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
26d10 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
26d20 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
26d30 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
26d40 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
26d50 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
26d60 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
26d70 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
26d80 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
26d90 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
26da0 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
26db0 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
26dc0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
26dd0 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
26de0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
26df0 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
26e00 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
26e10 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
26e20 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
26e30 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
26e40 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
26e50 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
26e60 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
26e70 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
26e80 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
26e90 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
26ea0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
26eb0 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
26ec0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
26ed0 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
26ee0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
26ef0 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
26f00 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
26f10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
26f20 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
26f30 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
26f40 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
26f50 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
26f60 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
26f70 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
26f80 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
26f90 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
26fa0 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
26fb0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
26fc0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
26fd0 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
26fe0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
26ff0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
27000 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
27010 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
27020 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
27030 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
27040 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
27050 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
27060 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
27070 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
27080 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
27090 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
270a0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
270b0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
270c0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
270d0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
270e0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
270f0 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
27100 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
27110 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
27120 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
27130 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
27140 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
27150 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
27160 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
27170 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
27180 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
27190 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
271a0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
271b0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
271c0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
271d0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
271e0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
271f0 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
27200 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
27210 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
27220 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
27230 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
27240 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
27250 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
27260 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
27270 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
27280 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
27290 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
272a0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
272b0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
272c0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
272d0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
272e0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
272f0 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
27300 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
27310 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
27320 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
27330 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
27340 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
27350 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
27360 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
27370 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
27380 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
27390 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
273a0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
273b0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
273c0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
273d0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
273e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
273f0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27400 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
27410 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
27420 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
27430 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
27440 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
27450 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
27460 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
27470 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
27480 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
27490 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
274a0 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
274b0 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
274c0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
274d0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
274e0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
274f0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
27500 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
27510 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
27520 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
27530 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
27540 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
27550 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65  new[0])>0) or we
27560 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20   are the.  ** a 
27570 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
27580 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
27590 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
275a0 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
275b0 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
275c0 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
275d0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
275e0 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  hat page..  */. 
275f0 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
27600 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
27610 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
27620 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
27630 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
27640 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
27650 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
27660 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
27670 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ble..  */.  asse
27680 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
27690 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73  1 );.  pageFlags
276a0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b   = pPage->aData[
276b0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
276c0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
276d0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
276e0 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
276f0 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
27700 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
27710 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
27720 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a  ] = pgnoOld[i];.
27730 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
27740 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
27750 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27760 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
27770 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
27780 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
27790 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
277a0 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
277b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
277c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
277d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
277e0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
277f0 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
27800 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
27810 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27820 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27830 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
27840 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
27850 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew++;.    }.    
27860 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
27870 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  ageFlags);.  }..
27880 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
27890 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
278a0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
278b0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
278c0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
278d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
278e0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
278f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27900 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
27910 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
27920 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
27930 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
27940 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
27950 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
27960 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
27970 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
27980 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
27990 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
279a0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
279b0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
279c0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
279d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
279e0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
279f0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
27a00 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
27a10 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
27a20 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
27a30 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
27a40 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
27a50 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
27a60 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
27a70 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
27a80 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
27a90 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
27aa0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
27ab0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
27ac0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
27ad0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
27ae0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
27af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
27b00 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
27b10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
27b20 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
27b30 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
27b40 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
27b50 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
27b60 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
27b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
27b80 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
27b90 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
27ba0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
27bb0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
27bc0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
27bd0 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
27be0 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
27bf0 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
27c00 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
27c10 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
27c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27c30 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
27c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
27c50 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
27c60 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
27c70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
27c80 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
27c90 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
27ca0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
27cb0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
27cc0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
27cd0 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
27ce0 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
27cf0 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
27d00 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
27d10 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
27d20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
27d30 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
27d40 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
27d50 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
27d60 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
27d70 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
27d80 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
27d90 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
27da0 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
27db0 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
27dc0 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
27dd0 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
27de0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
27df0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
27e00 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
27e10 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
27e20 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
27e30 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
27e40 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
27e50 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
27e60 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
27e70 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
27e80 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
27e90 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
27ea0 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
27eb0 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
27ec0 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
27ed0 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
27ee0 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
27ef0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
27f00 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
27f10 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
27f20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
27f30 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
27f40 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
27f50 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
27f60 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
27f70 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
27f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
27f90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27fa0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
27fb0 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
27fc0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
27fd0 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
27fe0 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
27ff0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
28000 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
28010 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
28020 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
28030 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
28040 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
28050 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66  rflow==0 );..#if
28060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28070 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28080 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
28090 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
280a0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
280b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
280c0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
280d0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
280e0 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
280f0 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
28100 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
28110 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
28120 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
28130 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
28140 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
28150 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
28160 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
28170 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
28180 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28190 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f  cuum ){.      fo
281a0 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
281b0 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
281c0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
281d0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
281e0 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
281f0 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
28200 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
28210 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
28220 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
28230 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
28240 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
28250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28270 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28280 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
28290 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
282a0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
282b0 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  f..    j = cntNe
282c0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
282d0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
282e0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
282f0 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
28300 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
28310 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
28320 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
28330 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
28340 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
28350 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20  if( i<nNew-1 && 
28360 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
28370 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
28380 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
28390 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
283a0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
283b0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
283c0 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
283d0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
283e0 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
283f0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
28400 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
28410 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
28420 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
28430 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
28440 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
28450 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28460 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
28470 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
28480 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
28490 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
284a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
284b0 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
284c0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
284d0 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
284e0 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
284f0 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
28500 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
28510 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
28520 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
28530 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
28540 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
28550 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
28560 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
28570 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
28580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
28590 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
285a0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
285b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
285c0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
285d0 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
285e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
285f0 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  ll = &aSpace[iSp
28600 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69  ace];.        fi
28610 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
28620 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
28630 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
28640 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 53  &sz);.        iS
28650 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
28660 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
28670 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
28680 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70  e*5 );.        p
28690 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
286a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
286b0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
286c0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
286d0 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
286e0 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
286f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28700 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
28710 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
28720 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
28730 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
28740 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
28750 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
28760 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
28770 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
28780 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
28790 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
287a0 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
287b0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
287c0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
287d0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
287e0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
287f0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
28800 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
28810 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
28820 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
28830 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
28840 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
28850 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
28860 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
28870 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
28880 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
28890 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
288a0 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
288b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
288c0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
288d0 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
288e0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
288f0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
28900 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
28910 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
28920 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
28930 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
28940 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
28950 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
28960 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
28970 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
28980 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
28990 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
289a0 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
289b0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
289c0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
289d0 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
289e0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
289f0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
28a00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28a10 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
28a20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
28a30 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
28a40 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b  , sz, pTemp, 4);
28a50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28a60 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
28a70 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
28a80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
28a90 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
28aa0 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c  (pParent,nxDiv),
28ab0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69   pNew->pgno);.#i
28ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28ad0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28ae0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
28af0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
28b00 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f  database, and no
28b10 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  t a leaf-data tr
28b20 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ee,.      ** the
28b30 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  n update the poi
28b40 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e  nter map with an
28b50 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
28b60 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
28b70 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63     ** that the c
28b80 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65  ell just inserte
28b90 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20  d points to (if 
28ba0 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
28bb0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
28bc0 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61  toVacuum && !lea
28bd0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
28be0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
28bf0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
28c00 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
28c10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28c20 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
28c30 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28c50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
28c60 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
28c70 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  v++;.    }.  }. 
28c80 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
28c90 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  l );.  assert( n
28ca0 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Old>0 );.  asser
28cb0 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69  t( nNew>0 );.  i
28cc0 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
28cd0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
28ce0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
28cf0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
28d00 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  [8], &apCopy[nOl
28d10 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  d-1]->aData[8], 
28d20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78  4);.  }.  if( nx
28d30 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
28d40 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
28d50 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
28d60 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
28d70 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
28d80 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
28d90 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
28da0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
28db0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
28dc0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
28dd0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
28de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28df0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
28e00 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
28e10 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
28e20 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
28e30 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
28e40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
28e50 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
28e60 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
28e70 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
28e80 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
28e90 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
28ea0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
28eb0 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e  eparent children
28ec0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20   of all cells.. 
28ed0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
28ee0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
28ef0 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
28f00 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69  ildPages(apNew[i
28f10 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
28f20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
28f30 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28f40 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70  ;.  }.  rc = rep
28f50 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
28f60 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
28f70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28f80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
28f90 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  anup;..  /*.  **
28fa0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   Balance the par
28fb0 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20  ent page.  Note 
28fc0 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
28fd0 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69   page (pPage) mi
28fe0 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ght.  ** have be
28ff0 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  en added to the 
29000 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d  freelist so it m
29010 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62  ight no longer b
29020 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
29030 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65   ** But the pare
29040 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77  nt page will alw
29050 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ays be initializ
29060 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
29070 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
29080 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c  it );.  rc = bal
29090 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
290a0 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ;.  .  /*.  ** C
290b0 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
290c0 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
290d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
290e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
290f0 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
29100 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
29110 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29120 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
29130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
29140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
29150 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
29160 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
29170 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
29180 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29190 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20  : finished with 
291a0 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  %d: old=%d new=%
291b0 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
291c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
291d0 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77  pgno, nOld, nNew
291e0 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74  , nCell));.  ret
291f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29210 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
29220 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
29230 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f  tree when the ro
29240 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  ot.** page conta
29250 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54  ins no cells.  T
29260 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74  his is an opport
29270 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68  unity to make th
29280 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f  e tree.** shallo
29290 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c  wer by one level
292a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
292b0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
292c0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
292d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  ){.  MemPage *pC
292e0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
292f0 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68    /* The only ch
29300 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67  ild page of pPag
29310 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
29320 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
29330 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
29340 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f  er for pChild */
29350 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29360 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
29370 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
29380 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
29390 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  s */.  BtShared 
293a0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
293b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
293c0 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75  in BTree structu
293d0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65  re */.  int mxCe
293e0 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20  llPerPage;      
293f0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
29400 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
29410 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  per page */.  u8
29420 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20   **apCell;      
29430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
29440 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67  l cells from pag
29450 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
29460 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
29470 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
29480 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
29490 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
294a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
294b0 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
294c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
294d0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
294e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
294f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29500 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29510 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
29520 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65  >pBt;.  mxCellPe
29530 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28  rPage = MX_CELL(
29540 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  pBt);.  apCell =
29550 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
29560 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
29570 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
29580 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66  of(u16)) );.  if
29590 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
295a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
295b0 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75  M;.  szCell = (u
295c0 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  16*)&apCell[mxCe
295d0 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
295e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
295f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
29600 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
29610 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
29620 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
29630 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
29640 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
29650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29660 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
29670 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
29680 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
29690 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
296a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
296b0 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
296c0 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
296d0 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
296e0 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
296f0 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
29700 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
29710 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
29720 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
29730 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
29740 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
29750 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
29760 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
29770 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
29780 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
29790 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
297a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
297b0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
297c0 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
297d0 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
297e0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
297f0 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
29800 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
29810 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
29820 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
29830 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
29840 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
29850 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
29860 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
29870 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
29880 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
29890 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
298a0 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
298b0 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
298c0 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
298d0 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
298e0 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
298f0 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  */.    pgnoChild
29900 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
29910 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
29920 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29930 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29940 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61  Child>0 );.    a
29950 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
29960 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  <=sqlite3PagerPa
29970 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  gecount(pPage->p
29980 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20  Bt->pPager) );. 
29990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
299a0 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67  treeGetPage(pPag
299b0 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  e->pBt, pgnoChil
299c0 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a  d, &pChild, 0);.
299d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
299e0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
299f0 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70  lance;.    if( p
29a00 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  Page->pgno==1 ){
29a10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29a20 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
29a30 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
29a40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
29a50 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
29a60 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
29a70 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
29a80 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
29a90 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
29aa0 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a  ->nFree>=100 ){.
29ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
29ac0 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hild information
29ad0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
29ae0 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64   root page, so d
29af0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
29b00 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20   copy */.       
29b10 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
29b20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
29b30 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
29b40 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
29b50 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43  =0; i<pChild->nC
29b60 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
29b70 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d       apCell[i] =
29b80 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64   findCell(pChild
29b90 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ,i);.          s
29ba0 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53  zCell[i] = cellS
29bb0 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61  izePtr(pChild, a
29bc0 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  pCell[i]);.     
29bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
29be0 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c  emblePage(pPage,
29bf0 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20   pChild->nCell, 
29c00 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b  apCell, szCell);
29c10 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
29c20 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
29c30 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
29c40 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
29c50 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  /.        put4by
29c60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29c70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29c80 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
29c90 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
29ca0 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
29cb0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
29cc0 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  );.        freeP
29cd0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
29ce0 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
29cf0 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74  ANCE: child %d t
29d00 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20  ransfer to page 
29d10 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
29d20 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  no));.      }els
29d30 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
29d40 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65  e child has more
29d50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
29d60 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
29d70 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20  e root..        
29d80 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61  ** The tree is a
29d90 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e  lready balanced.
29da0 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f    Do nothing. */
29db0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
29dc0 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
29dd0 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  %d will not fit 
29de0 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  on page 1\n", pC
29df0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
29e00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29e10 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
29e20 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69  age->aData, pChi
29e30 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65  ld->aData, pPage
29e40 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29e50 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e);.      pPage-
29e60 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
29e70 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
29e80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
29e90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
29ea0 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
29eb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29ed0 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28  .      freePage(
29ee0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54  pChild);.      T
29ef0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29f00 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25  transfer child %
29f10 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e  d into root %d\n
29f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29f30 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70   pChild->pgno, p
29f40 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
29f50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70    }.    rc = rep
29f60 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
29f70 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65  pPage);.    asse
29f80 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
29f90 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
29fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29fb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
29fc0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
29fd0 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  m ){.      int i
29fe0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29ff0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2a000 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20   i++){ .        
2a010 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2a020 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  fl(pPage, i);.  
2a030 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a050 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68       goto end_sh
2a060 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2a070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a080 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2a090 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2a0a0 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73  hild);.  }.end_s
2a0b0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a  hallow_balance:.
2a0c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2a0d0 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
2a0e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2a0f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2a100 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
2a110 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
2a120 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
2a130 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
2a140 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
2a150 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
2a160 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
2a170 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
2a180 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
2a190 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
2a1a0 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
2a1b0 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
2a1c0 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
2a1d0 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
2a1e0 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
2a1f0 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
2a200 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
2a210 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
2a220 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
2a230 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
2a240 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2a250 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a260 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
2a270 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2a280 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2a290 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2a2a0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2a2b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2a2c0 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50  oChild;     /* P
2a2d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a2e0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2a2f0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2a300 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt;         /* 
2a310 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69  The BTree */.  i
2a320 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
2a330 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62     /* Total usab
2a340 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  le size of a pag
2a350 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  e */.  u8 *data;
2a360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a370 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72  ntent of the par
2a380 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ent page */.  u8
2a390 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20   *cdata;        
2a3a0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2a3b0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a  the child page *
2a3c0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2a3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a3e0 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72  t to page header
2a3f0 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   in parent */.  
2a400 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
2a410 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2a420 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73   content of firs
2a430 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74  t cell in parent
2a440 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2a450 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
2a460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a470 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2a480 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
2a490 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
2a4a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a4b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2a4c0 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   );.  rc = alloc
2a4d0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2a4e0 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
2a4f0 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
2a500 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
2a510 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2a530 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a540 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
2a550 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
2a560 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2a570 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
2a580 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
2a590 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2a5a0 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74  set;.  brk = get
2a5b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2a5c0 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70  5]);.  cdata = p
2a5d0 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20  Child->aData;.  
2a5e0 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64  memcpy(cdata, &d
2a5f0 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d  ata[hdr], pPage-
2a600 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
2a610 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b  age->nCell-hdr);
2a620 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61  .  memcpy(&cdata
2a630 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
2a640 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72  ], usableSize-br
2a650 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  k);.  assert( pC
2a660 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
2a670 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2a680 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2a690 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
2a6a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2a6b0 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2a6c0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  ;.  memcpy(pChil
2a6d0 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  d->aOvfl, pPage-
2a6e0 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e  >aOvfl, pPage->n
2a6f0 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
2a700 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2a710 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
2a720 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
2a730 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28  nOverflow;.  if(
2a740 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2a750 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64  ow ){.    pChild
2a760 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
2a770 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
2a780 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d  d->nCell==pPage-
2a790 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f  >nCell );.  zero
2a7a0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2a7b0 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
2a7c0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
2a7d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2a7e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a7f0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
2a800 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  ld);.  TRACE(("B
2a810 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
2a820 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
2a830 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43   pPage->pgno, pC
2a840 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69  hild->pgno));.#i
2a850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a860 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2a870 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2a880 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  um ){.    int i;
2a890 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2a8a0 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2a8b0 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2a8c0 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2a8d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a8e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70  goto balancedeep
2a8f0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28  er_out;.    for(
2a900 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2a910 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2a920 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a930 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b  Ovfl(pChild, i);
2a940 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a960 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a980 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62  .#endif.  rc = b
2a990 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2a9a0 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65  Child);..balance
2a9b0 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65  deeper_out:.  re
2a9c0 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2a9d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20  }../*.** Decide 
2a9f0 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61 67  if the page pPag
2aa00 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
2aa10 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61  lanced.  If bala
2aa20 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75  ncing is.** requ
2aa30 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61  ired, call the a
2aa40 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
2aa50 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  cing routine..*/
2aa60 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2aa70 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  nce(MemPage *pPa
2aa80 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b  ge, int insert){
2aa90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aaa0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2aab0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2aac0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2aad0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2aae0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2aaf0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2ab00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ab10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2ab20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ab30 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2ab40 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
2ab50 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2ab60 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 29  ce_deeper(pPage)
2ab70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ab80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ab90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2aba0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2abb0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2abc0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2abd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2abe0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2abf0 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  >0 || .        (
2ac00 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67 65  !insert && pPage
2ac10 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70  ->nFree>pPage->p
2ac20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2ac30 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  /3) ){.      rc 
2ac40 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2ac50 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  t(pPage);.    }.
2ac60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ac70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ac80 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2ac90 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2aca0 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2acb0 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2acc0 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2acd0 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2ace0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2acf0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2ad00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2ad10 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2ad20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2ad30 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2ad40 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2ad50 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2ad60 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2ad70 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2ad80 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2ad90 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2ada0 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2adb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2adc0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2add0 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e  LOCKED..**.** In
2ade0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65   addition to che
2adf0 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c  cking for read-l
2ae00 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72 65  ocks (where a re
2ae10 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e  ad-lock .** mean
2ae20 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
2ae30 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
2ae40 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  ) this routine a
2ae50 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c  lso moves.** all
2ae60 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 73   write cursors s
2ae70 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
2ae80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2ae90 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20 6f  .** first Cell o
2aea0 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  n the root page.
2aeb0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
2aec0 61 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69  ary because an i
2aed0 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c  nsert .** or del
2aee0 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ete might change
2aef0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2af00 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f  ells on a page o
2af10 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61  r delete.** a pa
2af20 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20  ge entirely and 
2af30 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
2af40 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73  o leave any curs
2af50 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ors .** pointing
2af60 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74   to non-existant
2af70 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e   pages or cells.
2af80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2af90 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74  heckReadLocks(Bt
2afa0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2afb0 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75  o pgnoRoot, BtCu
2afc0 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29 7b  rsor *pExclude){
2afd0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
2afe0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2aff0 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
2b000 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b010 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Btree->db;.  ass
2b020 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2b030 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
2b040 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ee) );.  for(p=p
2b050 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2b060 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2b070 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65   if( p==pExclude
2b080 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b090 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d   if( p->eState!=
2b0a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63  CURSOR_VALID ) c
2b0b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2b0c0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
2b0d0 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
2b0e0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
2b0f0 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Flag==0 ){.     
2b100 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65   sqlite3 *dbOthe
2b110 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64  r = p->pBtree->d
2b120 62 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f  b;.      if( dbO
2b130 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ther==0 ||.     
2b140 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62      (dbOther!=db
2b150 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c   && (dbOther->fl
2b160 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2b170 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30  dUncommitted)==0
2b180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2b190 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2b1a0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
2b1b0 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61 67  else if( p->pPag
2b1c0 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f  e->pgno!=p->pgno
2b1d0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f  Root ){.      mo
2b1e0 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20  veToRoot(p);.   
2b1f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b210 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
2b220 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
2b230 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
2b240 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
2b250 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
2b260 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
2b270 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
2b280 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
2b290 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
2b2a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
2b2b0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
2b2c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
2b2d0 6f 63 28 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  oc(MX_CELL_SIZE(
2b2e0 70 42 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pBt));.  }.}../*
2b2f0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2b300 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2b310 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
2b320 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
2b330 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
2b340 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
2b350 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
2b360 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
2b370 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
2b380 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
2b390 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
2b3a0 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
2b3b0 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
2b3c0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2b3d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2b3e0 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2b3f0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
2b400 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
2b410 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
2b420 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
2b430 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
2b440 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
2b450 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
2b460 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
2b470 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
2b480 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b490 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
2b4a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
2b4d0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
2b4e0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
2b4f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2b500 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2b510 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
2b520 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
2b530 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2b540 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
2b550 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
2b560 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
2b570 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b590 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b5a0 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
2b5b0 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
2b5c0 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
2b5d0 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20  Bias            
2b5e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b5f0 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
2b600 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  n append */.){. 
2b610 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
2b620 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
2b630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b640 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
2b650 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2b660 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2b670 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
2b680 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
2b690 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2b6a0 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
2b6b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b6c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b6d0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
2b6e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2b6f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2b700 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2b710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2b720 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e  fore doing an in
2b730 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d  sert */.    rc =
2b740 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2b750 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2b760 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2b770 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b780 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2b790 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2b7a0 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46    if( !pCur->wrF
2b7b0 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
2b7c0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
2b7d0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f   /* Cursor not o
2b7e0 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20  pen for writing 
2b7f0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65  */.  }.  if( che
2b800 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72  ckReadLocks(pCur
2b810 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e  ->pBtree, pCur->
2b820 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20  pgnoRoot, pCur) 
2b830 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b840 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
2b850 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
2b860 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
2b870 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
2b880 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2b890 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2b8a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2b8b0 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a  Cur->skip;.  }..
2b8c0 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
2b8d0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2b8e0 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
2b8f0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2b900 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  */.  clearCursor
2b910 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2b920 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
2b930 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2b940 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2b950 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2b960 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
2b970 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2b980 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2b990 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 30 2c  o(pCur, pKey, 0,
2b9a0 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
2b9b0 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20  s, &loc)).  ){. 
2b9c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b9d0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2b9e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2b9f0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2ba00 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
2ba10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ba20 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d  >leaf || !pPage-
2ba30 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54  >leafData );.  T
2ba40 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
2ba50 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
2ba60 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
2ba70 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
2ba80 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2ba90 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
2baa0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
2bab0 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
2bac0 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
2bad0 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
2bae0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2baf0 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
2bb00 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
2bb10 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
2bb20 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
2bb30 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
2bb40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2bb50 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
2bb60 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
2bb70 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
2bb80 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
2bb90 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
2bba0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2bbb0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2bbc0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
2bbd0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2bbe0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
2bbf0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
2bc00 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2bc10 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
2bc20 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2bc30 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2bc40 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
2bc50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2bc60 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
2bc70 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
2bc80 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
2bc90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bca0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2bcb0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2bcc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
2bcd0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
2bce0 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
2bcf0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2bd00 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
2bd10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2bd20 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2bd30 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2bd40 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2bd50 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2bd60 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2bd70 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2bd80 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2bd90 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2bda0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2bdb0 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2bdc0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2bdd0 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2bde0 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2bdf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2be00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2be10 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2be20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2be30 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2be40 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
2be50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2be60 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2be70 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2be80 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2be90 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
2bea0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
2beb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bec0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2bed0 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  t;.  rc = balanc
2bee0 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f  e(pPage, 1);.  /
2bef0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
2bf00 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74  geDump(pCur->pBt
2bf10 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2bf20 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66  , 1); */.  /* ff
2bf30 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
2bf40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bf50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2bf60 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2bf70 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2bf80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bf90 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
2bfa0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
2bfb0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2bfc0 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
2bfd0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2bfe0 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2bff0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
2c000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
2c010 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
2c020 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2c030 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2c040 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Page;.  unsigned
2c050 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2c060 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
2c070 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
2c080 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2c090 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2c0a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2c0b0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
2c0c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2c0d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c0e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2c0f0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
2c100 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2c110 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2c120 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2c130 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2c140 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74  re doing a delet
2c150 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42  e */.    rc = pB
2c160 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2c170 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2c180 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c1a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
2c1b0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
2c1c0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2c1d0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2c1e0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
2c1f0 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66  ->skip;.  }.  if
2c200 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70  ( pCur->idx >= p
2c210 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2c220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c230 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20  _ERROR;  /* The 
2c240 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2c250 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69  inting to anythi
2c260 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2c270 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2c280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c290 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69  TE_PERM;   /* Di
2c2a0 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20  d not open this 
2c2b0 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69  cursor for writi
2c2c0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2c2d0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2c2e0 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2c2f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2c300 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2c310 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2c320 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2c330 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2c340 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2c350 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
2c360 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2c370 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20  sor position (a 
2c380 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72  no-op if the cur
2c390 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20  sor is not in . 
2c3a0 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49   ** CURSOR_REQUI
2c3b0 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e  RESEEK state) an
2c3c0 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74  d save the posit
2c3d0 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
2c3e0 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20  r cursors .  ** 
2c3f0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2c400 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c   table. Then cal
2c410 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
2c420 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67  ite() on the pag
2c430 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
2c440 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65  entry will be de
2c450 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f  leted from..  */
2c460 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20  .  if( .    (rc 
2c470 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
2c480 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2c490 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2c4a0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2c4b0 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
2c4c0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
2c4d0 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2c4e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c4f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c500 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
2c510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2c520 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
2c530 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20  cell within its 
2c540 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
2c550 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
2c560 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
2c570 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
2c580 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
2c590 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
2c5a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2c5b0 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
2c5c0 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
2c5d0 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
2c5e0 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  */.  pCell = fin
2c5f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2c600 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21  r->idx);.  if( !
2c610 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c620 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
2c630 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
2c640 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72    }.  rc = clear
2c650 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2c660 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  l);.  if( rc ){.
2c670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c680 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
2c690 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
2c6a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72  .    ** The entr
2c6b0 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  y we are about t
2c6c0 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
2c6d0 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20  a leaf so if we 
2c6e0 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f  do not.    ** do
2c6f0 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69   something we wi
2c700 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20  ll leave a hole 
2c710 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70  on an internal p
2c720 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68  age..    ** We h
2c730 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ave to fill the 
2c740 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69  hole by moving i
2c750 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  n a cell from a 
2c760 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a  leaf.  The.    *
2c770 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65  * next Cell afte
2c780 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20  r the one to be 
2c790 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61  deleted is guara
2c7a0 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61  nteed to exist a
2c7b0 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  nd.    ** to be 
2c7c0 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e  a leaf so we can
2c7d0 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a   use it..    */.
2c7e0 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61      BtCursor lea
2c7f0 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  fCur;.    unsign
2c800 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
2c810 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
2c820 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2c830 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30  ar *tempCell = 0
2c840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
2c850 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29  Page->leafData )
2c860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
2c870 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
2c880 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b  pCur, &leafCur);
2c890 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c8a0 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66  3BtreeNext(&leaf
2c8b0 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  Cur, &notUsed);.
2c8c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2c8e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c8f0 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50  Write(leafCur.pP
2c900 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2c910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2c920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c930 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a      u16 szNext;.
2c940 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45        TRACE(("DE
2c950 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2c960 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66  elete internal f
2c970 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66  rom %d replace f
2c980 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
2c990 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2c9a0 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2c9b0 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50  pgno, leafCur.pP
2c9c0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2c9d0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2c9e0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2c9f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ca00 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20   pCell));.      
2ca10 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c  pNext = findCell
2ca20 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2ca30 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20  leafCur.idx);.  
2ca40 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c      szNext = cel
2ca50 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72  lSizePtr(leafCur
2ca60 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a  .pPage, pNext);.
2ca70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58        assert( MX
2ca80 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e  _CELL_SIZE(pBt)>
2ca90 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20  =szNext+4 );.   
2caa0 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
2cab0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
2cac0 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d   tempCell = pBt-
2cad0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
2cae0 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
2caf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2cb00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2cb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2cb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cb30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2cb40 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2cb50 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65  , pCur->idx, pNe
2cb60 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
2cb70 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
2cb80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cb90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cba0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2cbb0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2cbc0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2cbd0 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29  idx), pgnoChild)
2cbe0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
2cbf0 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2cc00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cc10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cc20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f  K ){.        dro
2cc30 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  pCell(leafCur.pP
2cc40 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2cc50 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20  , szNext);.     
2cc60 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2cc70 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 30  leafCur.pPage, 0
2cc80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cc90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2cca0 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73  eReleaseTempCurs
2ccb0 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  or(&leafCur);.  
2ccc0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45  }else{.    TRACE
2ccd0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2cce0 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20  =%d delete from 
2ccf0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2cd00 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2cd10 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  t, pPage->pgno))
2cd20 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2cd30 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2cd40 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2cd50 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2cd60 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2cd70 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  age, 0);.  }.  i
2cd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cd90 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2cda0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
2cdb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cdc0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2cdd0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
2cde0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
2cdf0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
2ce00 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
2ce10 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2ce20 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
2ce30 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
2ce40 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2ce50 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
2ce60 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
2ce70 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
2ce80 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
2ce90 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
2cea0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
2ceb0 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
2cec0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
2ced0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
2cee0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
2cef0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
2cf00 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
2cf10 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
2cf20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
2cf30 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
2cf40 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2cf50 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
2cf60 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
2cf70 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
2cf80 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
2cf90 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
2cfa0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2cfb0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
2cfc0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
2cfd0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
2cfe0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
2cff0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2d000 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
2d010 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2d020 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2d030 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2d040 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2d050 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20  ion first */.   
2d060 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2d070 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2d080 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2d090 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2d0a0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2d0b0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2d0c0 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  y );..#ifdef SQL
2d0d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d0e0 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63  UUM.  rc = alloc
2d0f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2d100 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2d110 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
2d120 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2d130 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65  rn rc;.  }.#else
2d140 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
2d150 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
2d160 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20  no pgnoMove;    
2d170 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65    /* Move a page
2d180 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f   here to make ro
2d190 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  om for the root-
2d1a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  page */.    MemP
2d1b0 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20  age *pPageMove; 
2d1c0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d  /* The page to m
2d1d0 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20  ove to. */..    
2d1e0 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65  /* Creating a ne
2d1f0 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62  w table may prob
2d200 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76  ably require mov
2d210 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
2d220 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
2d230 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2d240 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20   the new tables 
2d250 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61  root page. In ca
2d260 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72  se this page tur
2d270 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  ns.    ** out to
2d280 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2d290 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c  page, delete all
2d2a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d   overflow page-m
2d2b0 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a  ap caches.    **
2d2c0 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75   held by open cu
2d2d0 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  rsors..    */.  
2d2e0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
2d2f0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
2d300 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  );..    /* Read 
2d310 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
2d320 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61  a[3] from the da
2d330 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d  tabase to determ
2d340 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ine where the.  
2d350 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f    ** root page o
2d360 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2d370 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b  should go. meta[
2d380 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  3] is the larges
2d390 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2d3a0 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61  ** created so fa
2d3b0 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f  r, so the new ro
2d3c0 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61  ot-page is (meta
2d3d0 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20  [3]+1)..    */. 
2d3e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2d3f0 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
2d400 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
2d410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d430 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d440 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
2d450 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
2d460 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
2d470 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
2d480 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2d490 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
2d4a0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
2d4b0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2d4c0 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d  while( pgnoRoot=
2d4d0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2d4e0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
2d4f0 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
2d500 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
2d510 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
2d520 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
2d530 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2d540 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
2d550 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
2d560 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
2d570 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
2d580 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
2d590 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
2d5a0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
2d5b0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2d5c0 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
2d5d0 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
2d5e0 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
2d5f0 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
2d600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2d610 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2d620 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
2d630 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
2d640 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
2d650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d660 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d670 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2d680 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
2d690 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
2d6a0 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
2d6b0 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
2d6c0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
2d6d0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
2d6e0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
2d6f0 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
2d700 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
2d710 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
2d720 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
2d730 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
2d740 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
2d750 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
2d760 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
2d770 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
2d780 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
2d790 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2d7a0 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
2d7b0 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
2d7c0 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
2d7d0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
2d7e0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2d7f0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
2d800 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
2d810 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
2d820 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
2d830 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
2d840 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
2d850 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
2d860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d870 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2d880 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2d890 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
2d8a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d8b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2d8c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2d8d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2d8e0 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
2d8f0 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
2d900 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
2d910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d920 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2d930 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79  _ROOTPAGE || eTy
2d940 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2d950 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  AGE ){.        r
2d960 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d970 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d980 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2d990 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2d9a0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
2d9b0 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
2d9c0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
2d9d0 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20  P_FREEPAGE );.  
2d9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d9f0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2da00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2da10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2da20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2da30 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2da40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2da50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2da60 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2da70 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
2da80 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
2da90 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20  e, pgnoMove);.  
2daa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dab0 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
2dac0 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
2dad0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
2dae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2daf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2db00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2db10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2db20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2db30 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2db40 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2db50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2db60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2db70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2db80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2db90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2dba0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2dbb0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2dbc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dbd0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2dbe0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2dbf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dc00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2dc10 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
2dc20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
2dc30 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
2dc40 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2dc50 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
2dc60 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
2dc70 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
2dc80 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2dc90 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
2dca0 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
2dcb0 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
2dcc0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2dcd0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2dce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dcf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2dd00 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2dd10 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
2dd20 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2dd30 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2dd40 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2dd50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dd60 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
2dd70 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2dd80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2dd90 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2dda0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
2ddb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ddc0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
2ddd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2dde0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ddf0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
2de00 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
2de10 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
2de20 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
2de30 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
2de40 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
2de50 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
2de60 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
2de70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
2de80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2de90 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2dea0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2deb0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2dec0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2ded0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2dee0 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
2def0 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
2df00 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
2df10 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
2df20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2df30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2df40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2df50 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2df60 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2df70 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2df80 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2df90 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2dfa0 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2dfb0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2dfc0 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2dfd0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2dfe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2dff0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2e000 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2e010 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2e020 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2e030 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2e040 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2e050 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2e060 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2e070 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2e080 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2e090 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2e0a0 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2e0b0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2e0c0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2e0d0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2e0e0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2e0f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
2e100 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e110 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2e120 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
2e130 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
2e140 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
2e150 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
2e160 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e170 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
2e180 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2e190 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
2e1a0 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2e1b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e1c0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e1d0 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  _out;.  for(i=0;
2e1e0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2e1f0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i++){.    pCell
2e200 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2e210 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
2e220 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e230 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44       rc = clearD
2e240 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2e250 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2e260 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2e270 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2e280 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2e290 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2e2a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e2b0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2e2c0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
2e2d0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2e2e0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2e2f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
2e300 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e310 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2e320 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2e330 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2e340 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70  ta[8]), pPage->p
2e350 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2e360 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2e370 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e380 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  out;.  }.  if( f
2e390 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20  reePageFlag ){. 
2e3a0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2e3b0 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
2e3c0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
2e3d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2e3e0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30  ge->pDbPage))==0
2e3f0 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   ){.    zeroPage
2e400 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61  (pPage, pPage->a
2e410 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45  Data[0] | PTF_LE
2e420 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64  AF);.  }..cleard
2e430 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a  atabasepage_out:
2e440 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2e450 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
2e460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2e470 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ete all informat
2e480 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ion from a singl
2e490 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  e table in the d
2e4a0 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65  atabase.  iTable
2e4b0 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20   is.** the page 
2e4c0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f  number of the ro
2e4d0 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
2e4e0 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
2e4f0 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a  tine returns,.**
2e500 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2e510 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69  s empty, but sti
2e520 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ll exists..**.**
2e530 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
2e540 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
2e550 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
2e560 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
2e570 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73  .** read cursors
2e580 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   on the table.  
2e590 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f  Open write curso
2e5a0 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  rs are moved to 
2e5b0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74  the.** root of t
2e5c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
2e5d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2e5e0 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
2e5f0 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2e600 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
2e610 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2e620 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
2e630 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
2e640 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
2e650 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2e660 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2e670 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2e680 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2e690 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2e6a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
2e6b0 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52  if( (rc = checkR
2e6c0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
2e6d0 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49 54 45 5f  le, 0))!=SQLITE_
2e6e0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
2e6f0 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
2e700 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
2e710 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2e720 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
2e730 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
2e740 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
2e750 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
2e760 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2e770 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
2e780 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
2e790 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
2e7a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2e7b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e7c0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2e7d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2e7e0 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2e7f0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2e800 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2e810 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2e820 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2e830 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2e840 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2e850 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2e860 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2e870 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2e880 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2e890 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2e8a0 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2e8b0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2e8c0 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2e8d0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2e8e0 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2e8f0 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2e900 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2e910 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2e920 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2e930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2e940 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2e950 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2e960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e970 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2e980 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2e990 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2e9a0 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2e9b0 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2e9c0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2e9d0 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e9e0 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2e9f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2ea00 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2ea10 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2ea20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2ea30 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2ea40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2ea50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ea60 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2ea70 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2ea80 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2ea90 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2eaa0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2eab0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2eac0 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2ead0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2eae0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2eaf0 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2eb00 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2eb10 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2eb20 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2eb30 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2eb40 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2eb50 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2eb60 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2eb70 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2eb80 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2eb90 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
2eba0 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
2ebb0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2ebc0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2ebd0 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2ebe0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ebf0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2ec00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2ec10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2ec20 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2ec30 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
2ec40 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2ec50 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2ec60 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2ec70 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2ec80 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2ec90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
2eca0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2ecb0 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66   drop a table if
2ecc0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65   any cursors are
2ecd0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a   open on the.  *
2ece0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
2ecf0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61   is because in a
2ed00 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
2ed10 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a  the backend may.
2ed20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76    ** need to mov
2ed30 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70  e another root-p
2ed40 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61  age to fill a ga
2ed50 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2ed60 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20  leted.  ** root 
2ed70 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e  page. If an open
2ed80 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
2ed90 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72  g this page a pr
2eda0 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a  oblem would .  *
2edb0 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  * occur..  */.  
2edc0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
2edd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ede0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2edf0 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2ee00 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
2ee10 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
2ee20 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
2ee30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ee40 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
2ee50 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
2ee60 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69  (p, iTable);.  i
2ee70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
2ee80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2ee90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2eea0 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
2eeb0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
2eec0 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
2eed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2eee0 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
2eef0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2ef00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ef10 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
2ef20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2ef30 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
2ef40 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
2ef50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ef60 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2ef70 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67  p, 4, &maxRootPg
2ef80 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2ef90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2efa0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2efb0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2efc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2efd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2efe0 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f  ( iTable==maxRoo
2eff0 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  tPgno ){.       
2f000 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
2f010 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69   being dropped i
2f020 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  s the table with
2f030 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2f040 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2f050 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2f060 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68  database, put th
2f070 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74  e root page on t
2f080 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20  he free list. . 
2f090 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f0a0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2f0b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2f0c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f0d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2f0e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f0f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f100 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2f110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f120 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2f130 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
2f140 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68  does not have th
2f150 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
2f160 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2f170 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
2f180 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74  abase. So move t
2f190 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  he page that doe
2f1a0 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  s into the .    
2f1b0 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20      ** gap left 
2f1c0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  by the deleted r
2f1d0 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20  oot-page..      
2f1e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d    */.        Mem
2f1f0 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20  Page *pMove;.   
2f200 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f210 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2f220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f230 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
2f240 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
2f250 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
2f260 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f290 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2f2a0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
2f2b0 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50  t, pMove, PTRMAP
2f2c0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54  _ROOTPAGE, 0, iT
2f2d0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  able);.        r
2f2e0 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2f2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f310 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f320 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2f330 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f340 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2f350 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2f360 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
2f370 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f390 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f3b0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2f3c0 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2f3d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
2f3e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2f3f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f400 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f410 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2f420 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
2f430 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
2f440 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2f450 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
2f460 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
2f470 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
2f480 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
2f490 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
2f4a0 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
2f4b0 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
2f4c0 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
2f4d0 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
2f4e0 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
2f4f0 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
2f500 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
2f510 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
2f520 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
2f530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
2f540 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2f550 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
2f560 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
2f570 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2f580 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
2f590 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
2f5a0 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
2f5b0 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
2f5c0 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
2f5d0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
2f5e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2f5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2f600 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
2f610 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2f620 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
2f630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f640 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
2f650 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
2f660 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f670 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2f680 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2f690 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f6a0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
2f6b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2f6c0 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
2f6d0 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
2f6e0 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
2f6f0 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
2f700 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
2f710 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
2f720 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2f730 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2f740 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
2f750 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
2f760 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2f770 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
2f780 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
2f790 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
2f7a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
2f7b0 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
2f7c0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
2f7d0 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
2f7e0 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
2f7f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f800 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2f810 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
2f820 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
2f830 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
2f840 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
2f850 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
2f860 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
2f870 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
2f880 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2f890 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
2f8a0 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
2f8b0 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
2f8c0 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
2f8d0 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
2f8e0 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
2f8f0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
2f900 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
2f910 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
2f920 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
2f930 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
2f940 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
2f950 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
2f960 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
2f970 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
2f980 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
2f990 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
2f9a0 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
2f9b0 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
2f9c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2f9d0 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
2f9e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2f9f0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
2fa00 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
2fa10 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
2fa20 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  bPage;.  int rc;
2fa30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2fa40 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
2fa50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2fa60 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
2fa70 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
2fa80 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  >db = p->db;..  
2fa90 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
2faa0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
2fab0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
2fac0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
2fad0 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
2fae0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2faf0 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
2fb00 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
2fb10 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
2fb20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
2fb30 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2fb40 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2fb50 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
2fb60 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
2fb70 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
2fb80 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
2fb90 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2fba0 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
2fbb0 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
2fbc0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
2fbd0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2fbe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2fbf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2fc00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2fc10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2fc20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2fc30 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
2fc40 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
2fc50 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2fc60 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
2fc70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2fc80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
2fc90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
2fca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2fcb0 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
2fcc0 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
2fcd0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2fce0 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20  Page);.  *pMeta 
2fcf0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
2fd00 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20  36 + idx*4]);.  
2fd10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2fd20 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  f(pDbPage);..  /
2fd30 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65  * If autovacuume
2fd40 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  d is disabled in
2fd50 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20   this build but 
2fd60 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
2fd70 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e   .  ** access an
2fd80 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61   autovacuumed da
2fd90 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b  tabase, then mak
2fda0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  e the database r
2fdb0 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23  eadonly. .  */.#
2fdc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2fdd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2fde0 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d  f( idx==4 && *pM
2fdf0 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61  eta>0 ) pBt->rea
2fe00 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69  dOnly = 1;.#endi
2fe10 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  f..  /* Grab the
2fe20 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2fe30 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ge 1. */.  rc = 
2fe40 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20  lockTable(p, 1, 
2fe50 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  READ_LOCK);.  sq
2fe60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2fe70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2fe80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2fe90 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
2fea0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
2feb0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
2fec0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
2fed0 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
2fee0 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
2fef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2ff00 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
2ff10 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
2ff20 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
2ff30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2ff40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ff50 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
2ff60 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2ff70 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
2ff80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2ff90 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
2ffa0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
2ffb0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
2ffc0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2ffd0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2ffe0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2fff0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
30000 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
30010 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
30020 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20  Page1!=0 );.    
30030 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
30040 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
30050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30060 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
30070 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30090 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  K ){.      put4b
300a0 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
300b0 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69  x*4], iMeta);.#i
300c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
300d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
300e0 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b     if( idx==7 ){
300f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30100 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
30110 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a   || iMeta==0 );.
30120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30130 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74  iMeta==0 || iMet
30140 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  a==1 );.        
30150 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
30160 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d  = iMeta;.      }
30170 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
30180 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
30190 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
301a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
301b0 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20  Return the flag 
301c0 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69  byte at the begi
301d0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67  nning of the pag
301e0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
301f0 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  r.** is currentl
30200 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  y pointing to..*
30210 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30220 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  eeFlags(BtCursor
30230 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
30240 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43  DO: What about C
30250 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
30260 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c  K state? Probabl
30270 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20  y need to call. 
30280 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65   ** restoreOrCle
30290 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
302a0 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
302b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
302c0 20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72    restoreOrClear
302d0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
302e0 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Cur);.  pPage = 
302f0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
30300 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
30310 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
30320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30330 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74  ->pBt==pCur->pBt
30340 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
30350 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74  ge ? pPage->aDat
30360 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30370 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  et] : 0;.}.../*.
30380 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
30390 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
303a0 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
303b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
303c0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
303d0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
303e0 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
303f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
30400 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
30410 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
30420 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
30430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
30440 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
30450 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
30460 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
30470 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
30480 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30490 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
304a0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
304b0 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
304c0 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
304d0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
304e0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
304f0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
30500 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  2;.  if( !pCheck
30510 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
30520 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
30530 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
30540 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
30550 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
30560 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65    zMsg2 = sqlite
30570 33 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f  3VMPrintf(0, zFo
30580 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30590 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
305a0 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20  Msg1==0 ) zMsg1 
305b0 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65  = "";.  if( pChe
305c0 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ck->zErrMsg ){. 
305d0 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20     char *zOld = 
305e0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b  pCheck->zErrMsg;
305f0 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72  .    pCheck->zEr
30600 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71  rMsg = 0;.    sq
30610 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
30620 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
30630 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73   zOld, "\n", zMs
30640 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
30650 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
30660 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20  3_free(zOld);.  
30670 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
30680 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
30690 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d  eck->zErrMsg, zM
306a0 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61  sg1, zMsg2, (cha
306b0 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r*)0);.  }.  sql
306c0 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29  ite3_free(zMsg2)
306d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
306e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
306f0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
30700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30710 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
30720 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
30730 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
30740 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
30750 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
30760 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
30770 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30780 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
30790 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
307a0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
307b0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
307c0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
307d0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
307e0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
307f0 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
30800 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
30810 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
30820 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
30830 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
30840 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
30850 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
30860 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
30870 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30880 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
30890 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
308a0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
308b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
308c0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
308d0 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
308e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
308f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30900 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
30910 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
30920 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
30930 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
30940 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
30950 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
30960 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30970 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
30980 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
30990 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
309a0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
309b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
309c0 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
309d0 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
309e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
309f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
30a00 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
30a10 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
30a20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
30a30 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
30a40 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
30a50 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
30a60 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
30a70 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
30a80 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
30a90 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
30aa0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
30ab0 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
30ac0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
30ad0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
30ae0 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
30af0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
30b00 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
30b10 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
30b20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
30b30 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
30b40 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
30b50 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
30b60 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
30b70 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
30b80 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
30b90 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
30ba0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
30bb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
30bc0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
30bd0 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
30be0 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
30bf0 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
30c00 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
30c10 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
30c20 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
30c30 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
30c40 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
30c50 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
30c60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
30c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
30c80 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30c90 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
30ca0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
30cb0 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
30cc0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
30cd0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
30ce0 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
30cf0 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
30d00 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
30d10 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30d20 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30d30 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
30d40 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
30d50 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
30d60 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
30d70 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
30d80 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
30d90 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
30da0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
30db0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
30dc0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
30dd0 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
30de0 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
30df0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
30e00 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
30e10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30e20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
30e30 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
30e40 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
30e50 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
30e60 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
30e70 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
30e80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
30e90 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
30ea0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
30eb0 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
30ec0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
30ed0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
30ee0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
30ef0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
30f00 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
30f10 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
30f20 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
30f30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
30f40 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
30f50 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
30f60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
30f70 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
30f80 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
30f90 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
30fa0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
30fb0 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
30fc0 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
30fd0 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
30fe0 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
30ff0 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
31000 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
31010 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
31020 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
31030 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
31040 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31050 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31060 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
31070 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
31080 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
31090 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
310a0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
310b0 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
310c0 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
310d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
310e0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
310f0 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
31100 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
31110 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
31120 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
31130 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
31140 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
31150 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
31160 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31170 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
31180 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
31190 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
311a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
311b0 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
311c0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
311d0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
311e0 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
311f0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
31200 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
31210 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
31220 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
31230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31240 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31250 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
31260 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
31270 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
31280 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31290 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
312a0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
312b0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
312c0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
312d0 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
312e0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b  sableSize/4-8 ){
312f0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31300 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31310 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31320 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
31330 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
31340 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
31350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
31360 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
31370 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
31380 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
31390 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
313a0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
313b0 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
313c0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
313d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
313e0 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
313f0 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
31400 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
31410 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
31420 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
31430 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
31440 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
31450 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
31460 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31470 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
31480 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
31490 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
314a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
314b0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
314c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
314d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
314e0 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
314f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
31500 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
31510 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
31520 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
31530 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
31540 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
31550 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
31560 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
31570 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
31580 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
31590 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
315a0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
315b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
315c0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
315d0 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
315e0 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
315f0 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
31600 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
31610 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
31620 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
31630 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
31640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31650 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
31660 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
31670 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
31680 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31690 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
316a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
316b0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
316c0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
316d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
316e0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
316f0 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
31700 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
31710 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
31720 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
31730 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
31740 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
31750 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
31760 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
31770 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
31780 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
31790 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
317a0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
317b0 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
317c0 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
317d0 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
317e0 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
317f0 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
31800 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
31810 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
31820 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
31830 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
31840 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
31850 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
31860 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
31870 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
31880 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
31890 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
318a0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
318b0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
318c0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
318d0 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
318e0 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
318f0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
31900 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
31910 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
31920 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
31930 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
31940 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
31950 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
31960 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
31970 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
31980 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
31990 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
319a0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
319b0 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
319c0 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
319d0 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
319e0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
319f0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
31a00 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
31a10 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
31a20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
31a30 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
31a40 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
31a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31a60 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
31a70 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
31a80 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
31a90 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
31aa0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
31ab0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
31ac0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
31ad0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
31ae0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
31af0 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
31b00 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
31b10 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
31b20 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
31b30 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
31b40 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
31b50 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
31b60 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
31b70 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
31b80 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
31b90 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31ba0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
31bb0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
31bc0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
31bd0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
31be0 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
31bf0 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
31c00 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
31c10 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
31c20 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
31c30 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
31c40 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
31c50 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
31c60 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
31c70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
31c80 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
31c90 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
31ca0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
31cb0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
31cc0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31cd0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31ce0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
31cf0 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
31d00 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
31d10 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
31d20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
31d30 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
31d40 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
31d50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
31d60 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
31d70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31d80 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
31da0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
31db0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
31dc0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
31dd0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
31de0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
31df0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
31e00 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
31e10 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
31e20 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
31e30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
31e40 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
31e50 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
31e60 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
31e70 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
31e80 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
31e90 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
31ea0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
31eb0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
31ec0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
31ed0 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
31ee0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
31ef0 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
31f00 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
31f10 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
31f20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
31f30 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
31f40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
31f50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
31f60 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
31f70 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
31f80 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
31f90 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
31fa0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
31fb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
31fc0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
31fd0 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
31fe0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
31ff0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
32000 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
32010 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
32020 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
32030 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
32040 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
32050 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
32060 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
32070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32080 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
32090 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
320a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
320b0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
320c0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
320d0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
320e0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
320f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32100 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
32110 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
32120 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
32130 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
32140 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
32150 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
32160 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32170 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
32180 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
32190 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
321a0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
321b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
321c0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
321d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
321e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
321f0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
32200 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
32210 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
32220 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32230 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
32240 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
32250 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
32260 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
32270 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
32280 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
32290 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
322a0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
322b0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
322c0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
322d0 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
322e0 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
322f0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
32300 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
32310 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
32320 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32330 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
32340 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32350 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
32360 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  t), zContext, . 
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20      "On page %d 
32390 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
323a0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
323b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
323c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
323d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
323e0 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
323f0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
32400 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
32410 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
32420 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
32430 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
32440 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
32450 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
32460 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
32470 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
32480 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
32490 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
324a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
324b0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
324c0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
324d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
324e0 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
324f0 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20   if( hit ){.    
32500 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67  memset(hit, 1, g
32510 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
32520 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c  r+5]));.    nCel
32530 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
32540 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
32550 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20  cellStart = hdr 
32560 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
32570 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  leaf;.    for(i=
32580 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
32590 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d  {.      int pc =
325a0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
325b0 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b  cellStart+i*2]);
325c0 0a 20 20 20 20 20 20 75 31 36 20 73 69 7a 65 20  .      u16 size 
325d0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
325e0 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
325f0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
32600 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65      if( (pc+size
32610 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
32620 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20  || pc<0 ){.     
32630 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32640 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
32650 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
32660 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
32670 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
32680 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
32690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
326a0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b         for(j=pc+
326b0 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a  size-1; j>=pc; j
326c0 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
326d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
326e0 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74  for(cnt=0, i=get
326f0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
32700 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73  1]); i>0 && i<us
32710 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c  ableSize && cnt<
32720 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20  10000; .        
32730 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20     cnt++){.     
32740 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
32750 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29  byte(&data[i+2])
32760 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
32770 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65       if( (i+size
32780 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
32790 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  || i<0 ){.      
327a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
327b0 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20  (pCheck, 0,  .  
327c0 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
327d0 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
327e0 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
327f0 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
32800 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32810 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73         for(j=i+s
32820 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ize-1; j>=i; j--
32830 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
32840 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65    }.      i = ge
32850 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29  t2byte(&data[i])
32860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
32870 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c  i=cnt=0; i<usabl
32880 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
32890 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30     if( hit[i]==0
328a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b   ){.        cnt+
328b0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
328c0 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20  f( hit[i]>1 ){. 
328d0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
328e0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
328f0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74  .          "Mult
32900 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79  iple uses for by
32910 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  te %d of page %d
32920 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20  ", i, iPage);.  
32930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32950 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72  f( cnt!=data[hdr
32960 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  +7] ){.      che
32970 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32980 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
32990 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70    "Fragmented sp
329a0 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72  ace is %d byte r
329b0 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e  eported as %d on
329c0 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
329d0 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68       cnt, data[h
329e0 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20  dr+7], iPage);. 
329f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
32a00 65 33 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a 20  e3_free(hit);.. 
32a10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
32a20 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65  ge);.  return de
32a30 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  pth+1;.}.#endif 
32a40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
32a50 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
32a60 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
32a70 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
32a80 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  _CHECK./*.** Thi
32a90 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
32aa0 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20   complete check 
32ab0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72  of the given BTr
32ac0 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b  ee file.  aRoot[
32ad0 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79  ] is.** an array
32ae0 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72   of pages number
32af0 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65  s were each page
32b00 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72   number is the r
32b10 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61  oot page of.** a
32b20 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69   table.  nRoot i
32b30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
32b40 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
32b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
32b60 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74  thing checks out
32b70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
32b80 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66  eturns NULL.  If
32b90 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a   something is.**
32ba0 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72   amiss, an error
32bb0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
32bc0 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
32bd0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
32be0 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20  lloc().** and a 
32bf0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
32c00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
32c10 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20   returned.  The 
32c20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
32c30 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
32c40 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  le for freeing t
32c50 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
32c60 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
32c70 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
32c80 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
32c90 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  Check(.  Btree *
32ca0 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74  p,     /* The bt
32cb0 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65  ree to be checke
32cc0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f  d */.  int *aRoo
32cd0 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79  t,   /* An array
32ce0 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e   of root pages n
32cf0 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76  umbers for indiv
32d00 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20  idual trees */. 
32d10 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f   int nRoot,    /
32d20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
32d30 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a  ies in aRoot[] *
32d40 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20  /.  int mxErr,  
32d50 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74    /* Stop report
32d60 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72  ing errors after
32d70 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20   this many */.  
32d80 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a  int *pnErr    /*
32d90 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66   Write number of
32da0 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20   errors seen to 
32db0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f  this variable */
32dc0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
32dd0 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67  nt nRef;.  Integ
32de0 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20  rityCk sCheck;. 
32df0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
32e00 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
32e10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
32e20 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
32e30 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71  >db;.  nRef = sq
32e40 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
32e50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
32e60 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65  .  if( lockBtree
32e70 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51  WithRetry(p)!=SQ
32e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
32e90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
32ea0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
32eb0 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 22 55  sqlite3StrDup("U
32ec0 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65  nable to acquire
32ed0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
32ee0 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a  the database");.
32ef0 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74    }.  sCheck.pBt
32f00 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b   = pBt;.  sCheck
32f10 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  .pPager = pBt->p
32f20 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e  Pager;.  sCheck.
32f30 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
32f40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43  agerPagecount(sC
32f50 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20  heck.pPager);.  
32f60 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d  sCheck.mxErr = m
32f70 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  xErr;.  sCheck.n
32f80 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72  Err = 0;.  *pnEr
32f90 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  r = 0;.#ifndef S
32fa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32fb0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
32fc0 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20  >nTrunc!=0 ){.  
32fd0 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
32fe0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
32ff0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
33000 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
33010 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
33020 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
33030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33040 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
33050 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
33060 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
33070 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73 43  ite3_malloc( (sC
33080 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
33090 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
330a0 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
330b0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
330c0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
330d0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
330e0 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
330f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
33100 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
33110 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  rn sqlite3MPrint
33120 66 28 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c 65  f(p->db, "Unable
33130 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79   to malloc %d by
33140 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28  tes", .        (
33150 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
33160 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
33170 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Ref[0]));.  }.  
33180 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
33190 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
331a0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
331b0 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
331c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
331d0 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
331e0 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
331f0 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
33200 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68  ] = 1;.  }.  sCh
33210 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  eck.zErrMsg = 0;
33220 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
33230 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
33240 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a  e freelist.  */.
33250 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68    checkList(&sCh
33260 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65  eck, 1, get4byte
33270 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
33280 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20  Data[32]),.     
33290 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
332a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
332b0 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20  ata[36]), "Main 
332c0 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20  freelist: ");.. 
332d0 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68   /* Check all th
332e0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
332f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f   for(i=0; i<nRoo
33300 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72  t && sCheck.mxEr
33310 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
33320 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63   aRoot[i]==0 ) c
33330 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
33340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33350 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33360 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33370 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b  && aRoot[i]>1 ){
33380 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
33390 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ap(&sCheck, aRoo
333a0 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  t[i], PTRMAP_ROO
333b0 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20  TPAGE, 0, 0);.  
333c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
333d0 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43  heckTreePage(&sC
333e0 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
333f0 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65  0, "List of tree
33400 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a   roots: ");.  }.
33410 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
33420 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
33430 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65  e file is refere
33440 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nced.  */.  for(
33450 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=1; i<=sCheck.n
33460 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d  Page && sCheck.m
33470 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  xErr; i++){.#ifd
33480 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33490 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
334a0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
334b0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  ]==0 ){.      ch
334c0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
334d0 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
334e0 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
334f0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  , i);.    }.#els
33500 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  e.    /* If the 
33510 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
33520 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d  s auto-vacuum, m
33530 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c  ake sure no tabl
33540 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  es contain.    *
33550 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
33560 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33570 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
33580 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
33590 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]==0 && .       
335a0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
335b0 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42  Bt, i)!=i || !pB
335c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
335d0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
335e0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
335f0 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
33600 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
33610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43      }.    if( sC
33620 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30  heck.anRef[i]!=0
33630 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
33640 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
33650 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75  i)==i && pBt->au
33660 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
33670 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33680 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
33690 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
336a0 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  %d is referenced
336b0 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ", i);.    }.#en
336c0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  dif.  }..  /* Ma
336d0 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61  ke sure this ana
336e0 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65  lysis did not le
336f0 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20  ave any unref() 
33700 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c  pages.  */.  unl
33710 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
33720 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65  (pBt);.  if( nRe
33730 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65  f != sqlite3Page
33740 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
33750 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68  Pager) ){.    ch
33760 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
33770 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
33780 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67  "Outstanding pag
33790 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f  e count goes fro
337a0 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e  m %d to %d durin
337b0 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22  g this analysis"
337c0 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71  ,.      nRef, sq
337d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
337e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a  nt(pBt->pPager).
337f0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a      );.  }..  /*
33800 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72   Clean  up and r
33810 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20  eport errors..  
33820 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
33830 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c  eLeave(p);.  sql
33840 69 74 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b  ite3_free(sCheck
33850 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72  .anRef);.  *pnEr
33860 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b  r = sCheck.nErr;
33870 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
33880 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
33890 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
338a0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
338b0 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
338c0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
338d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
338e0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
338f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
33900 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69  pager filename i
33910 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
33920 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
33930 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
33940 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
33950 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
33960 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
33970 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
33980 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
33990 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  lename(Btree *p)
339a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
339b0 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
339c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
339d0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
339e0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
339f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33a00 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
33a10 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
33a20 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33a30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
33a40 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64  *.** The pager d
33a50 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73  irectory name is
33a60 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
33a70 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
33a80 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
33a90 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
33aa0 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
33ab0 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
33ac0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
33ad0 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
33ae0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
33af0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
33b00 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
33b10 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33b20 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70  agerDirname(p->p
33b30 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
33b40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
33b50 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
33b60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
33b70 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
33b80 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
33b90 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75  alue of this rou
33ba0 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65  tine is the same
33bb0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
33bc0 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  hether the journ
33bd0 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  al file.** has b
33be0 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e  een created or n
33bf0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ot..**.** The pa
33c00 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ger journal file
33c10 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
33c20 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
33c30 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
33c40 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
33c50 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
33c60 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
33c70 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
33c80 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33c90 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
33ca0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33cb0 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33cc0 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33cd0 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  rn sqlite3PagerJ
33ce0 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42  ournalname(p->pB
33cf0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23  t->pPager);.}..#
33d00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33d10 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
33d20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
33d30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74  e content of pBt
33d40 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e  From into pBtTo.
33d50 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a    A transaction.
33d60 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  ** must be activ
33d70 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73  e for both files
33d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ..**.** The size
33d90 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79   of file pTo may
33da0 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
33db0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
33dc0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
33dd0 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
33de0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
33df0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
33e00 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
33e10 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61  ssful, CommitPha
33e20 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63  seOne() may be c
33e30 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66  alled on pTo bef
33e40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a  ore returning. .
33e50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
33e60 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d  ould finish comm
33e70 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  itting the trans
33e80 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79  action on pTo by
33e90 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
33ea0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
33eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33ec0 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  btreeCopyFile(Bt
33ed0 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
33ee0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
33ef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33f00 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f   Pgno i;..  Pgno
33f10 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20   nFromPage;     
33f20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
33f30 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20  es in pFrom */. 
33f40 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20   Pgno nToPage;  
33f50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33f60 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a  f pages in pTo *
33f70 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67  /.  Pgno nNewPag
33f80 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  e;      /* Numbe
33f90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
33fa0 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79  o after the copy
33fb0 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69   */..  Pgno iSki
33fc0 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  p;         /* Pe
33fd0 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20  nding byte page 
33fe0 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20  in pTo */.  int 
33ff0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20  nToPageSize;    
34000 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20  /* Page size of 
34010 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  pTo in bytes */.
34020 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53    int nFromPageS
34030 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69  ize;  /* Page si
34040 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62  ze of pFrom in b
34050 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61  ytes */..  BtSha
34060 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f  red *pBtTo = pTo
34070 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65  ->pBt;.  BtShare
34080 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72  d *pBtFrom = pFr
34090 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f  om->pBt;.  pBtTo
340a0 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a  ->db = pTo->db;.
340b0 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20    pBtFrom->db = 
340c0 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54  pFrom->db;..  nT
340d0 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54  oPageSize = pBtT
340e0 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e  o->pageSize;.  n
340f0 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70  FromPageSize = p
34100 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65  BtFrom->pageSize
34110 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
34120 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
34130 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
34140 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
34150 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
34160 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
34170 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
34180 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
34190 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
341a0 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65  ;.  }..  nToPage
341b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
341c0 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
341d0 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d  pPager);.  nFrom
341e0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
341f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
34200 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
34210 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
34220 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
34230 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
34240 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68  e nNewPage is th
34250 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
34260 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
34270 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  ore the.  ** con
34280 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75  tents of pFrom u
34290 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
342a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
342b0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61  o..  */.  nNewPa
342c0 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d  ge = ((i64)nFrom
342d0 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f  Page * (i64)nFro
342e0 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34  mPageSize + (i64
342f0 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31  )nToPageSize - 1
34300 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29  ) / .      (i64)
34310 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  nToPageSize;..  
34320 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
34330 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54  ITE_OK && (i<=nT
34340 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77  oPage || i<=nNew
34350 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20  Page); i++){..  
34360 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65    /* Journal the
34370 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a   original page..
34380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53      **.    ** iS
34390 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20  kip is the page 
343a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f  number of the lo
343b0 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44  cking page (PEND
343c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20  ING_BYTE_PAGE). 
343d0 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73     ** in databas
343e0 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74  e *pTo (before t
343f0 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70  he copy). This p
34400 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69  age is never wri
34410 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74  tten .    ** int
34420 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
34430 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53  le. Unless i==iS
34440 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20  kip or the page 
34450 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70  was not.    ** p
34460 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65  resent in pTo be
34470 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70  fore the copy op
34480 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c  eration, journal
34490 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f   page i from pTo
344a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
344b0 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
344c0 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  nToPage ){.     
344d0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
344e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
344f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
34500 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
34510 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34520 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34530 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
34540 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34550 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
34560 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
34570 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
34580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34590 20 20 20 20 20 69 66 28 20 69 3e 6e 46 72 6f 6d       if( i>nFrom
345a0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
345b0 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65  /* Yeah.  It see
345c0 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c  ms wierd to call
345d0 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67   DontWrite() rig
345e0 68 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29  ht after Write()
345f0 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  . But.        **
34600 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65   that is because
34610 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
34620 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64  ose procedures d
34630 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20  o not exactly . 
34640 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73         ** repres
34650 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f  ent what they do
34660 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c  .  Write() reall
34670 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69  y means "put thi
34680 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20  s page in the.  
34690 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
346a0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
346b0 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
346c0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
346d0 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  e written.      
346e0 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
346f0 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
34700 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
34710 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
34720 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20   part of.       
34730 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72 65   ** that and pre
34740 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20 66  vents the page f
34750 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65  rom being writte
34760 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
34770 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  e. The.        *
34780 2a 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20  * page is still 
34790 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  on the rollback 
347a0 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e  journal, though.
347b0 20 20 41 6e 64 20 74 68 61 74 20 69 73 20 74 68    And that is th
347c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  e .        ** wh
347d0 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69  ole point of thi
347e0 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20  s block: to put 
347f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c  pages on the rol
34800 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a  lback journal. .
34810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34820 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
34830 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65  ontWrite(pDbPage
34840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34850 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34860 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
34870 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   }..    /* Overw
34880 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  rite the data in
34890 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74   page i of the t
348a0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a  arget database *
348b0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
348c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53  LITE_OK && i!=iS
348d0 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61  kip && i<=nNewPa
348e0 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50  ge ){..      DbP
348f0 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30  age *pToPage = 0
34900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
34910 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20  int64 iOff;..   
34920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34930 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
34940 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61  Pager, i, &pToPa
34950 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
34960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34970 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34980 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34990 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ToPage);.      }
349a0 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20  ..      for(.   
349b0 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a       iOff=(i-1)*
349c0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
349d0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
349e0 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54  _OK && iOff<i*nT
349f0 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20  oPageSize; .    
34a00 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f      iOff += nFro
34a10 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  mPageSize.      
34a20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  ){.        DbPag
34a30 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30  e *pFromPage = 0
34a40 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
34a50 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
34a60 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a  omPageSize)+1;..
34a70 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
34a80 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  m==PENDING_BYTE_
34a90 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b  PAGE(pBtFrom) ){
34aa0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
34ab0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
34ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34ad0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
34ae0 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46  From->pPager, iF
34af0 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29  rom, &pFromPage)
34b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34b20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
34b30 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  To = sqlite3Page
34b40 72 47 65 74 44 61 74 61 28 70 54 6f 50 61 67 65  rGetData(pToPage
34b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  );.          cha
34b60 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74  r *zFrom = sqlit
34b70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
34b80 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
34b90 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a       int nCopy;.
34ba0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
34bb0 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54  FromPageSize>=nT
34bc0 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  oPageSize ){.   
34bd0 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b           zFrom +
34be0 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65  = ((i-1)*nToPage
34bf0 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31  Size - ((iFrom-1
34c00 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  )*nFromPageSize)
34c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
34c20 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69  Copy = nToPageSi
34c30 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ze;.          }e
34c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
34c50 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d   zTo += (((iFrom
34c60 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a  -1)*nFromPageSiz
34c70 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61  e) - (i-1)*nToPa
34c80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
34c90 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72       nCopy = nFr
34ca0 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  omPageSize;.    
34cb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
34cc0 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a     memcpy(zTo, z
34cd0 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20  From, nCopy);.. 
34ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34cf0 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ef(pFromPage);. 
34d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34d10 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50  ..      if( pToP
34d20 61 67 65 20 29 20 73 71 6c 69 74 65 33 50 61 67  age ) sqlite3Pag
34d30 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29  erUnref(pToPage)
34d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34d50 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61 76 65  * If things have
34d60 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20   worked so far, 
34d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34d80 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  e may need to be
34d90 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64   .  ** truncated
34da0 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61  . The complex pa
34db0 72 74 20 69 73 20 74 68 61 74 20 69 74 20 6d 61  rt is that it ma
34dc0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75  y need to be tru
34dd0 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61  ncated to.  ** a
34de0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f   size that is no
34df0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
34e00 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65  tiple of nToPage
34e10 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65  Size - the curre
34e20 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a  nt.  ** page siz
34e30 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61  e used by the pa
34e40 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
34e50 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a  ith B-Tree pTo..
34e60 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78    **.  ** For ex
34e70 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70  ample, say the p
34e80 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20  age-size of pTo 
34e90 69 73 20 32 30 34 38 20 62 79 74 65 73 20 61 6e  is 2048 bytes an
34ea0 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a  d the original .
34eb0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
34ec0 61 67 65 73 20 69 73 20 35 20 28 31 30 20 4b 42  ages is 5 (10 KB
34ed0 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d   file). If pFrom
34ee0 20 68 61 73 20 61 20 70 61 67 65 20 73 69 7a 65   has a page size
34ef0 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62   of 1024 .  ** b
34f00 79 74 65 73 20 61 6e 64 20 39 20 70 61 67 65 73  ytes and 9 pages
34f10 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  , then the file 
34f20 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e  needs to be trun
34f30 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20  cated to 9KB..  
34f40 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
34f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
34f60 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21  ( nFromPageSize!
34f70 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a  =nToPageSize ){.
34f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
34f90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
34fa0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
34fb0 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  To->pPager);.   
34fc0 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28     i64 iSize = (
34fd0 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a  i64)nFromPageSiz
34fe0 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61  e * (i64)nFromPa
34ff0 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e  ge;.      i64 iN
35000 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50  ow = (i64)((nToP
35010 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54  age>nNewPage)?nT
35020 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20  oPage:nNewPage) 
35030 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69  * (i64)nToPageSi
35040 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69  ze; .      i64 i
35050 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29  Pending = ((i64)
35060 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35070 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36  E(pBtTo)-1) *(i6
35080 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20  4)nToPageSize;. 
35090 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
350a0 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20  iSize<=iNow );. 
350b0 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69   .      /* Commi
350c0 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63  t phase one sync
350d0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
350e0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
350f0 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a  th pTo .      **
35100 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
35110 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49  original data. I
35120 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20  t does not sync 
35130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35140 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c  e.      ** itsel
35150 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74  f. After doing t
35160 68 69 73 20 69 74 20 69 73 20 73 61 66 65 20 74  his it is safe t
35170 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65  o use OsTruncate
35180 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20  () and other.   
35190 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20     ** file APIs 
351a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
351b0 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20  file directly.. 
351c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42       */.      pB
351d0 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64  tTo->db = pTo->d
351e0 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  b;.      rc = sq
351f0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
35200 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e  PhaseOne(pBtTo->
35210 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29  pPager, 0, 0, 1)
35220 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a  ;.      if( iSiz
35230 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51  e<iNow && rc==SQ
35240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
35260 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c  sTruncate(pFile,
35270 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d   iSize);.      }
35280 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  .  .      /* The
35290 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65   loop that copie
352a0 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61  d data from data
352b0 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54  base pFrom to pT
352c0 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20  o did not.      
352d0 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ** populate the 
352e0 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20  locking page of 
352f0 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66  database pTo. If
35300 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
35310 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d  f.      ** pFrom
35320 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
35330 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68   that of pTo, th
35340 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61  is means some da
35350 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  ta will.      **
35360 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63   not have been c
35370 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a  opied. .      **
35380 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62  .      ** This b
35390 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20  lock copies the 
353a0 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f  missing data fro
353b0 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
353c0 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a   to pTo .      *
353d0 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49  * using file API
353e0 73 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20  s. This is safe 
353f0 62 65 63 61 75 73 65 20 61 74 20 74 68 69 73 20  because at this 
35400 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68  point we know th
35410 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  at.      ** all 
35420 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
35430 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61  data from pTo ha
35440 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e  s been synced in
35450 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  to the .      **
35460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
35470 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
35480 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f  would be safe to
35490 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a   do anything at.
354a0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20        ** all to 
354b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
354c0 65 20 65 78 63 65 70 74 20 74 72 75 6e 63 61 74  e except truncat
354d0 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  e it to zero byt
354e0 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
354f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35500 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67  E_OK && nFromPag
35510 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a  eSize<nToPageSiz
35520 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64  e && iSize>iPend
35530 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ing){.        i6
35540 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  4 iOff;.        
35550 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 69  for(.          i
35560 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20  Off=iPending; . 
35570 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
35580 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28  ITE_OK && iOff<(
35590 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65  iPending+nToPage
355a0 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20  Size); .        
355b0 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50    iOff += nFromP
355c0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
355d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ){.          DbP
355e0 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d  age *pFromPage =
355f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67   0;.          Pg
35600 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66  no iFrom = (iOff
35610 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b  /nFromPageSize)+
35620 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  1;.  .          
35630 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49  if( iFrom==PENDI
35640 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
35650 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e  From) || iFrom>n
35660 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  FromPage ){.    
35670 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
35680 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35690 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
356a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
356b0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c  pBtFrom->pPager,
356c0 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61   iFrom, &pFromPa
356d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
356e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
356f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35700 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71  char *zFrom = sq
35710 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
35720 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  a(pFromPage);.  
35730 09 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
35740 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46  sWrite(pFile, zF
35750 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69  rom, nFromPageSi
35760 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  ze, iOff);.     
35770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35780 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
35790 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
357a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
357b0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53   }.  .      /* S
357c0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
357d0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69   file */.      i
357e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
357f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35800 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
35810 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  c(pBtTo->pPager)
35820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
35830 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
35840 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
35850 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
35860 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20  er, nNewPage);. 
35870 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
35880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35890 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65 53      pBtTo->pageS
358a0 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20  izeFixed = 0;.  
358b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
358c0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
358d0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54  BtreeRollback(pT
358e0 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  o);.  }..  retur
358f0 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
35900 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69  lite3BtreeCopyFi
35910 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
35920 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
35930 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
35940 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29  3BtreeEnter(pTo)
35950 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
35960 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20  Enter(pFrom);.  
35970 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69  rc = btreeCopyFi
35980 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a  le(pTo, pFrom);.
35990 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
359a0 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71  ave(pFrom);.  sq
359b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
359c0 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTo);.  return r
359d0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
359e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
359f0 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
35a00 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
35a10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
35a20 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
35a30 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
35a40 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
35a50 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
35a60 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
35a70 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
35a80 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
35a90 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e  (p && (p->inTran
35aa0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29  s==TRANS_WRITE))
35ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35ac0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20  n non-zero if a 
35ad0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
35ae0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
35af0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
35b00 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72  treeIsInStmt(Btr
35b10 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
35b20 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
35b30 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
35b40 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20   return (p->pBt 
35b50 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d  && p->pBt->inStm
35b60 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
35b70 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
35b80 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65  a read (or write
35b90 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ) transaction is
35ba0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
35bb0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
35bc0 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20  ReadTrans(Btree 
35bd0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
35be0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35bf0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
35c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
35c10 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  & (p->inTrans!=T
35c20 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a  RANS_NONE));.}..
35c30 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35c40 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
35c50 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20  inter to a blob 
35c60 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
35c70 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73  ated with.** a s
35c80 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72  ingle shared-btr
35c90 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  ee. The memory i
35ca0 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74  s used by client
35cb0 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f 77   code for its ow
35cc0 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66  n.** purposes (f
35cd0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73  or example, to s
35ce0 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65  tore a high-leve
35cf0 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61  l schema associa
35d00 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
35d10 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20   shared-btree). 
35d20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  The btree layer 
35d30 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63  manages referenc
35d40 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65  e counting issue
35d50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
35d60 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20  st time this is 
35d70 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
35d80 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73  ed-btree, nBytes
35d90 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
35da0 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  .** are allocate
35db0 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72  d, zeroed, and r
35dc0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
35dd0 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20  aller. For each 
35de0 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63  subsequent .** c
35df0 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70  all the nBytes p
35e00 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
35e10 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  red and a pointe
35e20 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c  r to the same bl
35e30 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  ob.** of memory 
35e40 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  returned. .**.**
35e50 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
35e60 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
35e70 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
35e80 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
35e90 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
35ea0 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
35eb0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
35ec0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
35ed0 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
35ee0 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
35ef0 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
35f00 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
35f10 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  not call sqlite3
35f20 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68  _free().** on th
35f30 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74  e memory, the bt
35f40 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74  ree layer does t
35f50 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  hat..*/.void *sq
35f60 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
35f70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
35f80 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72  Bytes, void(*xFr
35f90 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20  ee)(void *)){.  
35fa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
35fb0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
35fc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
35fd0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68    if( !pBt->pSch
35fe0 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ema ){.    pBt->
35ff0 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
36000 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74  3MallocZero(nByt
36010 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46  es);.    pBt->xF
36020 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65  reeSchema = xFre
36030 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
36040 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
36050 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63   return pBt->pSc
36060 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  hema;.}../*.** R
36070 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
36080 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68  other user of th
36090 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74  e same shared bt
360a0 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d  ree as the argum
360b0 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f  ent.** handle ho
360c0 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
360d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c   lock on the sql
360e0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
360f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36100 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65  BtreeSchemaLocke
36110 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  d(Btree *p){.  i
36120 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
36130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36140 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
36150 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
36160 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
36170 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c  c = (queryTableL
36180 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
36190 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d  OT, READ_LOCK)!=
361a0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
361b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
361c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
361d0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
361e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
361f0 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  CACHE./*.** Obta
36200 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  in a lock on the
36210 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f   table whose roo
36220 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20  t page is iTab. 
36230 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20   The.** lock is 
36240 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  a write lock if 
36250 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74  isWritelock is t
36260 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f  rue or a read lo
36270 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66  ck.** if it is f
36280 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alse..*/.int sql
36290 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
362a0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
362b0 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74   iTab, u8 isWrit
362c0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
362d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
362e0 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69  u8 lockType = (i
362f0 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45  sWriteLock?WRITE
36300 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29  _LOCK:READ_LOCK)
36310 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36320 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
36330 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
36340 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
36350 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
36360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
36370 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
36380 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
36390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
363a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
363b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
363c0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
363d0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
363e0 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  B./*.** Argument
363f0 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20   pCsr must be a 
36400 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f  cursor opened fo
36410 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20  r writing on an 
36420 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  .** INTKEY table
36430 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
36440 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74  ing at a valid t
36450 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20  able entry. .** 
36460 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
36470 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20  difies the data 
36480 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
36490 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a  f that entry..**
364a0 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63   Only the data c
364b0 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20  ontent may only 
364c0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20  be modified, it 
364d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
364e0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
364f0 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
36500 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69  ata stored..*/.i
36510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
36520 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  utData(BtCursor 
36530 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCsr, u32 offse
36540 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
36550 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *z){.  assert( 
36560 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
36570 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCsr) );.  asse
36580 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36590 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42 74  x_held(pCsr->pBt
365a0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
365b0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73 72  );.  assert(pCsr
365c0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
365d0 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  le);.  if( pCsr-
365e0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
365f0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
36600 20 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74     if( pCsr->eSt
36610 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
36620 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
36630 6e 20 70 43 73 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCsr->skip;.  
36640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
36660 52 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  RT;.    }.  }.. 
36670 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70   /* Check some p
36680 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20  reconditions: . 
36690 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75   **   (a) the cu
366a0 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72  rsor is open for
366b0 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20   writing,.  **  
366c0 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (b) there is no
366d0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
366e0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f  e table being mo
366f0 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20  dified and.  ** 
36700 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72    (c) the cursor
36710 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c   points at a val
36720 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74  id row of an int
36730 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  Key table..  */.
36740 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46    if( !pCsr->wrF
36750 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
36760 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
36770 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
36780 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61   !pCsr->pBt->rea
36790 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20  dOnly .         
367a0 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69   && pCsr->pBt->i
367b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
367c0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
367d0 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
367e0 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCsr->pBtree, 
367f0 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCsr->pgnoRoot, 
36800 70 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65 74  pCsr) ){.    ret
36810 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
36820 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
36830 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
36840 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
36850 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73 72  /.  }.  if( pCsr
36860 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
36870 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43 73  _INVALID || !pCs
36880 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
36890 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
368a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
368b0 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ..  return acces
368c0 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f  sPayload(pCsr, o
368d0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
368e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c 20  igned char *)z, 
368f0 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  0, 1);.}../* .**
36900 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20 74   Set a flag on t
36910 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63 61  his cursor to ca
36920 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  che the location
36930 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d 20  s of pages from 
36940 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  the .** overflow
36950 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63 75   list for the cu
36960 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 20  rrent row. This 
36970 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73 6f  is used by curso
36980 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72  rs opened.** for
36990 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
369a0 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  b IO only..**.**
369b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
369c0 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e  ets a flag only.
369d0 20 54 68 65 20 61 63 74 75 61 6c 20 70 61 67 65   The actual page
369e0 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65 0a   location cache.
369f0 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42 74  ** (stored in Bt
36a00 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
36a10 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  []) is allocated
36a20 20 61 6e 64 20 75 73 65 64 20 62 79 20 66 75 6e   and used by fun
36a30 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50  ction.** accessP
36a40 61 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77 6f  ayload() (the wo
36a50 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  rker function fo
36a60 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  r sqlite3BtreeDa
36a70 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  ta() and.** sqli
36a80 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28  te3BtreePutData(
36a90 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ))..*/.void sqli
36aa0 74 65 33 42 74 72 65 65 43 61 63 68 65 4f 76 65  te3BtreeCacheOve
36ab0 72 66 6c 6f 77 28 42 74 43 75 72 73 6f 72 20 2a  rflow(BtCursor *
36ac0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
36ad0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
36ae0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
36af0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36b00 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
36b10 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
36b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43   );.  assert(!pC
36b30 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
36b40 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ndle);.  assert(
36b50 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
36b60 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63  );.  pCur->isInc
36b70 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b  rblobHandle = 1;
36b80 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.