/ Hex Artifact Content
Login

Artifact 984962aa403be49d79784f01cc9887d16cd841ed:


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 33 20 32 30 30 38 2f 30  c,v 1.443 2008/0
0190: 33 2f 32 35 20 30 30 3a 32 32 3a 32 31 20 64 72  3/25 00:22:21 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: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
2ab0: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
2ac0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2ae0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2af0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
2b00: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2b10: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b20: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2b30: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2b40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2b50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b60: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2b70: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2b80: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
2b90: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
2ba0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
2bb0: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
2bc0: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f  te3BtreeRestoreO
2bd0: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2be0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
2bf0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
2c00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2c30: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2c40: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2c50: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2c60: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2c70: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2c80: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2c90: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2ca0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2cb0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2cc0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
2cd0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
2ce0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2cf0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
2d00: 65 73 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50  esPerMapPage, iP
2d10: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
2d20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2d30: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2d40: 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73  tex) );.  nPages
2d50: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
2d60: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
2d70: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
2d80: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
2d90: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
2da0: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
2db0: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
2dc0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
2dd0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2de0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
2df0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2e00: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
2e10: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2e20: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2e30: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
2e40: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
2e50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
2e60: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
2e70: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
2e80: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
2e90: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
2ea0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
2eb0: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
2ec0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
2ed0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
2ee0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
2ef0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
2f00: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
2f10: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
2f20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2f30: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
2f40: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
2f50: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
2f60: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
2f70: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2f80: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
2f90: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
2fa0: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
2fb0: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
2fc0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
2fd0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
2fe0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
2ff0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
3000: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
3010: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
3020: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3030: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3040: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3050: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
3060: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
3070: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
3080: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
3090: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
30a0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
30b0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
30c0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
30d0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
30e0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
30f0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
3100: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
3110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
3120: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
3130: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
3140: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
3150: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3160: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
3170: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
3180: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
3190: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
31b0: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
31c0: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
31d0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50  (pBt, key);.  pP
31e0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
31f0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
3200: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
3210: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
3220: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
3230: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
3240: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
3250: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
3260: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
3270: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
3280: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
3290: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
32a0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32b0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
32c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
32e0: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
32f0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
3300: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
3310: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
3320: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
3330: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
3340: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
3350: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
3360: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
3370: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3380: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3390: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
33a0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
33b0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
33c0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
33d0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
33e0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
33f0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
3400: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
3410: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
3420: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
3430: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
3440: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
3450: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
3460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
3470: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
3480: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
3490: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
34a0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
34b0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
34c0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
34d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
34e0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
34f0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
3500: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
3510: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
3520: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
3530: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
3540: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
3550: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
3560: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
3570: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
3580: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3590: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
35b0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
35c0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
35d0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
35e0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
35f0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
3600: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
3610: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
3620: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
3630: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
3640: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3650: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
3660: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3670: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
3680: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3690: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
36a0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
36b0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
36c0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
36d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
36e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
36f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3700: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
3710: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
3720: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
3730: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3740: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3760: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3770: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3780: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
3790: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
37a0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
37b0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
37c0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
37d0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
37e0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
37f0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
3800: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
3810: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
3820: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
3830: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3840: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
3850: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
3860: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3870: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
3880: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3890: 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65  ell) \.  ((pPage
38a0: 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62  )->aData + get2b
38b0: 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44  yte(&(pPage)->aD
38c0: 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c  ata[(pPage)->cel
38d0: 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c  lOffset+2*(iCell
38e0: 29 5d 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  )])).#ifdef SQLI
38f0: 54 45 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69  TE_TEST.u8 *sqli
3900: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
3910: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
3920: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61   int iCell){.  a
3930: 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20  ssert( iCell>=0 
3940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  );.  assert( iCe
3950: 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 70 50 61  ll<get2byte(&pPa
3960: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
3970: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
3980: 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  ;.  return findC
3990: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
39a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
39b0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
39c0: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
39d0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  f sqlite3BtreeFi
39e0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
39f0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
3a00: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
3a10: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
3a20: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
3a30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
3a40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3a50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3a60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3a70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3a90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3aa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
3ab0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
3ac0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3ad0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
3ae0: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
3af0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
3b00: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
3b10: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
3b20: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
3b30: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3b40: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
3b50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3b60: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
3b70: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
3b80: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
3b90: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
3ba0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
3bb0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
3bc0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
3bd0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
3be0: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
3bf0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
3c00: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3c10: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3c20: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
3c30: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
3c40: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
3c50: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
3c60: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
3c70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3c80: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
3c90: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
3ca0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
3cb0: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
3cc0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
3cd0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
3ce0: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
3cf0: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
3d00: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
3d10: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
3d20: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3d30: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
3d40: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
3d50: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
3d60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
3d70: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3d80: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3d90: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3da0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
3db0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
3dc0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
3dd0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3de0: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
3df0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
3e00: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
3e10: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
3e20: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
3e30: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3e50: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
3e60: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
3e70: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3e90: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3ea0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
3eb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
3ec0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3ed0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
3ee0: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
3ef0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
3f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
3f10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
3f20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
3f30: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
3f40: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
3f50: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
3f60: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
3f70: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
3f80: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3f90: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3fa0: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65  &nPayload);.  }e
3fb0: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
3fc0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  d = 0;.  }.  pIn
3fd0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
3fe0: 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67  load;.  if( pPag
3ff0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
4000: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
4010: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
4020: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
4030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
4040: 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  2 x;.    n += ge
4050: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
4060: 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49  [n], &x);.    pI
4070: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20  nfo->nKey = x;. 
4080: 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78     nPayload += x
4090: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
40a0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
40b0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
40c0: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
40d0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
40e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
40f0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
4100: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
4110: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
4120: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
4130: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
4140: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
4150: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
4160: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
4170: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
4180: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
4190: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
41a0: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
41b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
41c0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
41d0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
41e0: 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20   = 0;.    nSize 
41f0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
4200: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
4210: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
4220: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
4230: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
4240: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
4250: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
4260: 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b   nSize;.  }else{
4270: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
4280: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
4290: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
42a0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
42b0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
42c0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
42d0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
42e0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
42f0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
4300: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
4310: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
4320: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
4330: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
4340: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
4350: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
4360: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
4370: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
4380: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
4390: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
43a0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
43b0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
43c0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
43d0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
43e0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
43f0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
4400: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
4410: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
4420: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
4430: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
4440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
4450: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
4460: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
4470: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
4480: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
4490: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
44a0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
44b0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
44c0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
44d0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
44e0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
44f0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
4500: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
4510: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
4520: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
4530: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
4540: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
4550: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
4560: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
4570: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
4580: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
4590: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
45a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
45b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
45c0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
45d0: 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  = surplus;.    }
45e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
45f0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c  o->nLocal = minL
4600: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
4610: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
4620: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   = pInfo->nLocal
4630: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
4640: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
4650: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
4660: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
4670: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
4680: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
4690: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
46a0: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
46b0: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
46c0: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
46d0: 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69  Info)).void sqli
46e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
46f0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
4700: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
4710: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
4720: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
4730: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
4740: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
4750: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
4760: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
4770: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
4780: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
4790: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
47a0: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
47b0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
47c0: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
47d0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
47e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
47f0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
4800: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
4810: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
4820: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
4830: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
4840: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
4850: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
4860: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
4870: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
4880: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
4890: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
48a0: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
48b0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
48c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
48d0: 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  UG.static u16 ce
48e0: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
48f0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
4900: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
4910: 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  fo;.  sqlite3Btr
4920: 65 65 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  eeParseCell(pPag
4930: 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, iCell, &info)
4940: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4950: 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nSize;.}.#endif.
4960: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
4970: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
4980: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4990: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
49a0: 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  fo;.  sqlite3Btr
49b0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
49c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
49d0: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
49e0: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  fo.nSize;.}..#if
49f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a00: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
4a10: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
4a20: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
4a30: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
4a40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4a50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
4a60: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
4a70: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
4a80: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
4a90: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4ab0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
4ac0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4ad0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69   u8 *pCell){.  i
4ae0: 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( pCell ){.    
4af0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4b00: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
4b10: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4b20: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4b30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
4b40: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4b50: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4b60: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
4b70: 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28  yload );.    if(
4b80: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4b90: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4ba0: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
4bb0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
4bc0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
4bd0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
4be0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
4bf0: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
4c00: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
4c10: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
4c20: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
4c30: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
4c40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4c50: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
4c60: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4c70: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
4c80: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
4c90: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4ca0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
4cb0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
4cc0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4cd0: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
4ce0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
4cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4d00: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
4d10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4d20: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
4d30: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
4d40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4d50: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4d60: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
4d70: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
4d80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4d90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
4da0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
4db0: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
4dc0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
4dd0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
4de0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
4df0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
4e00: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
4e10: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
4e20: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
4e30: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
4e40: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
4e50: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
4e60: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
4e70: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
4e80: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
4e90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
4ea0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
4eb0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
4ec0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
4ed0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
4f00: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
4f30: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
4f40: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
4f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4f60: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
4f70: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
4f80: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
4f90: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4fb0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
4fc0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
4fd0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4ff0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
5000: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
5010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5020: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
5030: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
5040: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
5050: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
5060: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5070: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5080: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  ay */.  int brk;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
50b0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
50c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
50d0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
50e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
50f0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
5100: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
5110: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
5120: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
5130: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
5140: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
5150: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
5160: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
5170: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
5180: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
5190: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
51a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
51b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
51c0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
51d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
51e0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
51f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
5200: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5210: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
5220: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
5230: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5240: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5250: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
5260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
5270: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
5280: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
5290: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
52a0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
52b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
52c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
52d0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
52e0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
52f0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
5300: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
5310: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
5320: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
5330: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
5340: 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d  bleSize;.  brk =
5350: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5360: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
5370: 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64  y(&temp[brk], &d
5380: 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
5390: 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62  Size - brk);.  b
53a0: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
53b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
53c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
53d0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
53e0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
53f0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
5400: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
5410: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
5420: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
5430: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73  (pAddr);.    ass
5440: 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70  ert( pc<pPage->p
5450: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
5460: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
5470: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
5480: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
5490: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
54a0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72   memcpy(&data[br
54b0: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
54c0: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
54d0: 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a  te(pAddr, brk);.
54e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72    }.  assert( br
54f0: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
5500: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
5510: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5520: 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68  , brk);.  data[h
5530: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
5540: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
5550: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
5560: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
5570: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
5580: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
5590: 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29  r], 0, brk-addr)
55a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
55b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
55c0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
55d0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20  tes of space on 
55e0: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  a page..**.** Re
55f0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
5600: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
5610: 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  [] of the first 
5620: 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  byte of.** the n
5630: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f  ew allocation. O
5640: 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
5650: 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67  ere is not enoug
5660: 68 20 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20  h free.** space 
5670: 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 73  on the page to s
5680: 61 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63  atisfy the alloc
5690: 61 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a  ation request..*
56a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
56b0: 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73   contains nBytes
56c0: 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62   of free space b
56d0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ut does not cont
56e0: 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66  ain.** nBytes of
56f0: 20 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65   contiguous free
5700: 20 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69   space, then thi
5710: 73 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61  s routine automa
5720: 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73  tically.** calls
5730: 20 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65   defragementPage
5740: 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74  () to consolidat
5750: 65 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  e all free space
5760: 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f   before .** allo
5770: 63 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63  cating the new c
5780: 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hunk..*/.static 
5790: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
57a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
57b0: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
57c0: 69 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64  int addr, pc, hd
57d0: 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20  r;.  int size;. 
57e0: 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e   int nFrag;.  in
57f0: 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65  t top;.  int nCe
5800: 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66  ll;.  int cellOf
5810: 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  fset;.  unsigned
5820: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a   char *data;.  .
5830: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
5840: 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  aData;.  assert(
5850: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
5860: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
5870: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
5880: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
5890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
58a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
58b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
58c0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79  ex) );.  if( nBy
58d0: 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34  te<4 ) nByte = 4
58e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
58f0: 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50  Free<nByte || pP
5900: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
5910: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
5920: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e  Page->nFree -= n
5930: 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Byte;.  hdr = pP
5940: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
5950: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
5960: 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46  hdr+7];.  if( nF
5970: 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a  rag<60 ){.    /*
5980: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
5990: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
59a0: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
59b0: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
59c0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72  e.    ** space r
59d0: 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61  equest. */.    a
59e0: 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20  ddr = hdr+1;.   
59f0: 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65   while( (pc = ge
5a00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
5a10: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  r]))>0 ){.      
5a20: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
5a30: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
5a40: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
5a50: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
5a60: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
5a70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
5a80: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
5a90: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
5aa0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
5ab0: 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20  dr+7] = nFrag + 
5ac0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
5ad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5ae0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
5af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  {.          put2
5b00: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
5b10: 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20  , size-nByte);. 
5b20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5b30: 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  pc + size - nByt
5b40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
5b50: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
5b60: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
5b70: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
5b80: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
5b90: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
5ba0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
5bb0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
5bc0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
5bd0: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
5be0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5bf0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
5c00: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
5c10: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
5c20: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
5c30: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
5c40: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
5c50: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
5c60: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
5c70: 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64  yte ){.    if( d
5c80: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
5c90: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  age) ) return 0;
5ca0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
5cb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5cc0: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
5cd0: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
5ce0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
5cf0: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
5d00: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5d10: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
5d20: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
5d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
5d40: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
5d50: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
5d60: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
5d70: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5d80: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
5d90: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
5da0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
5db0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
5dc0: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
5dd0: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
5de0: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
5df0: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
5e00: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
5e10: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
5e20: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
5e30: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
5e40: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
5e50: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
5e60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5e70: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
5e80: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
5e90: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
5ea0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5eb0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5ec0: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
5ed0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
5ee0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5ef0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
5f00: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
5f10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
5f20: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
5f30: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
5f40: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
5f50: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
5f60: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
5f70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
5f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5f90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5fa0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5fb0: 29 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c  ) );.  if( size<
5fc0: 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23  4 ) size = 4;..#
5fd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
5fe0: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
5ff0: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
6000: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
6010: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
6020: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
6030: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
6040: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
6050: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
6060: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
6070: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
6080: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
6090: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
60a0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
60b0: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
60c0: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
60d0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
60e0: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
60f0: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6100: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6110: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
6120: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
6130: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6140: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
6150: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
6160: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
6170: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72  addr );.    addr
6180: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
6190: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
61a0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
61b0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61  bleSize-4 );.  a
61c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
61d0: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
61e0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
61f0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
6200: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6210: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
6220: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
6230: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
6240: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
6250: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a  nFree += size;..
6260: 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64    /* Coalesce ad
6270: 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63  jacent free bloc
6280: 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70  ks */.  addr = p
6290: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
62a0: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
62b0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
62c0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
62d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78   ){.    int pnex
62e0: 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73  t, psize;.    as
62f0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6300: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
6310: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
6320: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
6330: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
6340: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6350: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
6360: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
6370: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
6380: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
6390: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
63a0: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
63b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
63c0: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
63d0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
63e0: 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d    assert( frag<=
63f0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6400: 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20  ffset+7] );.    
6410: 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64    data[pPage->hd
6420: 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72  rOffset+7] -= fr
6430: 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ag;.      put2by
6440: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6450: 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  , get2byte(&data
6460: 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20  [pnext]));.     
6470: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6480: 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74  pbegin+2], pnext
6490: 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  +get2byte(&data[
64a0: 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e  pnext+2])-pbegin
64b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
64c0: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
64d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
64e0: 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  /* If the cell c
64f0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69  ontent area begi
6500: 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c  ns with a freebl
6510: 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20  ock, remove it. 
6520: 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  */.  if( data[hd
6530: 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35  r+1]==data[hdr+5
6540: 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] && data[hdr+2]
6550: 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b  ==data[hdr+6] ){
6560: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  .    int top;.  
6570: 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62    pbegin = get2b
6580: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
6590: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
65a0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74  ata[hdr+1], &dat
65b0: 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20  a[pbegin], 2);. 
65c0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
65d0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
65e0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
65f0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20  ata[hdr+5], top 
6600: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
6610: 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20  [pbegin+2]));.  
6620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  }.}../*.** Decod
6630: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
6640: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
6650: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
6660: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
6670: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
6680: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
6690: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
66a0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
66b0: 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46  tic void decodeF
66c0: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
66d0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
66e0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
66f0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
6700: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
6710: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
6720: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
6730: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
6740: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
6750: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6760: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6770: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6780: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
6790: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
67a0: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
67b0: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
67c0: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
67d0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
67e0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
67f0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
6800: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
6810: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
6820: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
6830: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
6840: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
6850: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
6860: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
6870: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
6880: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
6890: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
68a0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
68b0: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
68c0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
68d0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
68e0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
68f0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
6900: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
6910: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
6920: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
6930: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6940: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
6950: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6960: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
6970: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
6980: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
6990: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
69a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
69b0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
69c0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
69d0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
69e0: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
69f0: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
6a00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
6a10: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
6a20: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
6a30: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
6a40: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
6a50: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
6a60: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
6a70: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
6a80: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
6a90: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
6aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
6ab0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
6ac0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
6ad0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
6ae0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
6af0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
6b00: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
6b10: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
6b20: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
6b30: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
6b40: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
6b50: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
6b60: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
6b70: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
6b80: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
6b90: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
6ba0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
6bb0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
6bc0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
6bd0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
6be0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
6bf0: 20 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74   page to be init
6c00: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d  ialized */.  Mem
6c10: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
6c20: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
6c30: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6c40: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63  L */.){.  int pc
6c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6c60: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
6c70: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
6c80: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
6c90: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
6ca0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
6cb0: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
6cc0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
6cd0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
6ce0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
6cf0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
6d00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
6d10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
6d20: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
6d30: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  re */.  int usab
6d40: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
6d50: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
6d60: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
6d70: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6d80: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
6d90: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
6da0: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
6db0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
6dc0: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
6dd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6de0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
6df0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
6e00: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
6e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
6e20: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
6e30: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
6e40: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
6e50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21  ;.  assert( pBt!
6e60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6e70: 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50  pParent==0 || pP
6e80: 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20  arent->pBt==pBt 
6e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
6ea0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6eb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6ed0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
6ee0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
6ef0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6f00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
6f10: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6f20: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
6f30: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
6f40: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
6f50: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
6f60: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
6f70: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
6f80: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
6f90: 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28 70 50  !=pParent && (pP
6fa0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20  age->pParent!=0 
6fb0: 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  || pPage->isInit
6fc0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
6fd0: 70 61 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75  parent page shou
6fe0: 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20  ld never change 
6ff0: 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20  unless the file 
7000: 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  is corrupt */.  
7010: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7020: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7030: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  }.  if( pPage->i
7040: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
7050: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
7060: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
7070: 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20  0 && pParent!=0 
7080: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50  ){.    pPage->pP
7090: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
70a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
70b0: 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
70c0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64  bPage);.  }.  hd
70d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
70e0: 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
70f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64  Page->aData;.  d
7100: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
7110: 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20  , data[hdr]);.  
7120: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7130: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7140: 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75  dxShift = 0;.  u
7150: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
7160: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
7170: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7180: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
7190: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
71a0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20  ge->leaf;.  top 
71b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
71c0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67  [hdr+5]);.  pPag
71d0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
71e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
71f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
7200: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
7210: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
7220: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
7230: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
7240: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
7250: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
7260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7270: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7280: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
7290: 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  l==0 && pParent!
72a0: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70  =0 && pParent->p
72b0: 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  gno!=1 ){.    /*
72c0: 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20   All pages must 
72d0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
72e0: 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66  e cell, except f
72f0: 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  or root pages */
7300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7310: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7320: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
7330: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
7340: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
7350: 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  age */.  pc = ge
7360: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7370: 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
7380: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
7390: 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20  p - (cellOffset 
73a0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
73b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30  );.  while( pc>0
73c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74   ){.    int next
73d0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
73e0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
73f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
7400: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
7410: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
7420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7430: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
7440: 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65   }.    next = ge
7450: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
7460: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  );.    size = ge
7470: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
7480: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  2]);.    if( nex
7490: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
74a0: 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20  size+3 ){.      
74b0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
74c0: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
74d0: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
74e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
74f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7500: 20 20 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20      }.    nFree 
7510: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20  += size;.    pc 
7520: 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50  = next;.  }.  pP
7530: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72  age->nFree = nFr
7540: 65 65 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e  ee;.  if( nFree>
7550: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  =usableSize ){. 
7560: 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65     /* Free space
7570: 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74   cannot exceed t
7580: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
7590: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
75a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
75b0: 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d  ; .  }..  pPage-
75c0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72  >isInit = 1;.  r
75d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
75e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
75f0: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7600: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7610: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7620: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7630: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7640: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7650: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7660: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7680: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7690: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
76a0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
76b0: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
76c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
76d0: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
76e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
76f0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7700: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7710: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7720: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7730: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7740: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7750: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7760: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7770: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7780: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7790: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
77a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
77b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
77c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
77d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
77e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
77f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73  mutex) );.  mems
7800: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
7810: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
7820: 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61  e - hdr);.  data
7830: 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20  [hdr] = flags;. 
7840: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
7850: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
7860: 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65  _LEAF)==0);.  me
7870: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
7880: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
7890: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
78a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
78b0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
78c0: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
78d0: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
78e0: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
78f0: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
7900: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
7910: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7920: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
7930: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
7940: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
7950: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7960: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
7970: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  = 0;.  pPage->nC
7980: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
7990: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
79a0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
79b0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
79c0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
79d0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
79e0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
79f0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
7a00: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
7a10: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
7a20: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
7a30: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
7a40: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
7a50: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
7a60: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
7a70: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
7a80: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
7a90: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
7aa0: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
7ab0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
7ac0: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
7ad0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
7ae0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
7af0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
7b00: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
7b10: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
7b20: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
7b30: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
7b40: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
7b50: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
7b60: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
7b70: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
7b80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
7b90: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
7ba0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
7bb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
7bc0: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
7bd0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
7be0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
7bf0: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
7c00: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
7c10: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
7c20: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
7c30: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
7c40: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
7c50: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
7c60: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
7c70: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
7c80: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
7c90: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50  ge *pPage;.  DbP
7ca0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
7cb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7cc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7cd0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
7ce0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
7cf0: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
7d00: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
7d10: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43  **)&pDbPage, noC
7d20: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  ontent);.  if( r
7d30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7d40: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
7d50: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
7d60: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
7d70: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
7d80: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
7d90: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7da0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
7db0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
7dc0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
7dd0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
7de0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
7df0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
7e00: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
7e10: 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65  0 : 0;.  *ppPage
7e20: 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75   = pPage;.  retu
7e30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7e40: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
7e50: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
7e60: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
7e70: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
7e80: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
7e90: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
7ea0: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
7eb0: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
7ec0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7ed0: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
7ee0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
7ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7f00: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
7f10: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
7f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7f30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7f40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
7f50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7f60: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
7f70: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
7f80: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7f90: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
7fa0: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
7fb0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
7fc0: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
7fd0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
7fe0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7ff0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8000: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8010: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8020: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
8030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8040: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a  RUPT_BKPT; .  }.
8050: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8060: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
8070: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
8080: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
8090: 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67  TE_OK && (*ppPag
80a0: 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
80b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
80c0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a  3BtreeInitPage(*
80d0: 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  ppPage, pParent)
80e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
80f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
8100: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
8110: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
8120: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
8130: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
8140: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
8150: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
8160: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
8170: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
8180: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
8190: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
81a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
81b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
81c0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
81d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
81e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
81f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
8200: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
8210: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8220: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8230: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
8240: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
8250: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8260: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8270: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8280: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
8290: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
82a0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
82b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
82c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
82d0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
82e0: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
82f0: 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a  age.** reaches z
8300: 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ero.  We need to
8310: 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65   unref the pPare
8320: 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20  nt pointer when 
8330: 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e  that.** happens.
8340: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8350: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44  pageDestructor(D
8360: 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e  bPage *pData, in
8370: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
8380: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
8390: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
83a0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
83b0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
83c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
83d0: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
83e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
83f0: 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71  >isInit==0 || sq
8400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8410: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8420: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
8430: 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20  ge->pParent ){. 
8440: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72     MemPage *pPar
8450: 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
8460: 72 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74  rent;.    assert
8470: 28 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d  ( pParent->pBt==
8480: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
8490: 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
84a0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
84b0: 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
84c0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49    }.  pPage->isI
84d0: 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 0;.}../*.*
84e0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
84f0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
8500: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
8510: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
8520: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
8530: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
8540: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
8550: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
8560: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
8570: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8580: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
8590: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
85a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
85b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
85c0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
85d0: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
85e0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
85f0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
8600: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
8610: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
8620: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
8630: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
8640: 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e  bPage *pData, in
8650: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
8660: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
8670: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
8680: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
8690: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
86a0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
86b0: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
86c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
86d0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
86e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
86f0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8700: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
8710: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
8720: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  0;.    sqlite3Bt
8730: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
8740: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
8750: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
8760: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
8770: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
8780: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
8790: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
87a0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
87b0: 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  r(void *pArg, in
87c0: 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64  t n){.  BtShared
87d0: 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
87e0: 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
87f0: 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
8800: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8810: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8820: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8830: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
8840: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
8850: 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
8860: 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
8870: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
8880: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
8890: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
88a0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
88b0: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
88c0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
88d0: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
88e0: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
88f0: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
8900: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
8910: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
8920: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
8930: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
8940: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
8950: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66  is called..** If
8960: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
8970: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
8980: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8990: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
89a0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
89b0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
89c0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
89d0: 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
89e0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
89f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8a00: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
8a10: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
8a20: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
8a30: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
8a40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
8a50: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
8a60: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
8a70: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
8a80: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
8a90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8aa0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
8ab0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
8ac0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
8ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
8ae0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
8af0: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
8b00: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
8b10: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
8b20: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
8b30: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
8b40: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
8b50: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
8b60: 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72  use for this btr
8b70: 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ee */.  BtShared
8b80: 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
8b90: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
8ba0: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
8bb0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bd0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
8be0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8c00: 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e  t nReserve;.  un
8c10: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
8c20: 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f  eader[100];..  /
8c30: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
8c40: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
8c50: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
8c60: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
8c70: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
8c80: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
8c90: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d  tabase. This sym
8ca0: 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  bol is only requ
8cb0: 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74  ired if.  ** eit
8cc0: 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65  her of the share
8cd0: 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61  d-data or autova
8ce0: 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72  cuum features ar
8cf0: 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a  e compiled .  **
8d00: 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72   into the librar
8d10: 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  y..  */.#if !def
8d20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8d30: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c  _SHARED_CACHE) |
8d40: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
8d50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8d60: 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  M).  #ifdef SQLI
8d70: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8d80: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
8d90: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65  sMemdb = 0;.  #e
8da0: 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
8db0: 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c  t isMemdb = zFil
8dc0: 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70  ename && !strcmp
8dd0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
8de0: 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69  mory:");.  #endi
8df0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  f.#endif..  asse
8e00: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
8e10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8e20: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
8e30: 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20  tex) );..  pVfs 
8e40: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20  = db->pVfs;.  p 
8e50: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
8e60: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
8e70: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
8e80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8e90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
8ea0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
8eb0: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
8ec0: 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69  = db;..#if !defi
8ed0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8ee0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
8ef0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8f00: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
8f10: 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
8f20: 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
8f30: 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
8f40: 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
8f50: 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
8f60: 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
8f70: 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
8f80: 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
8f90: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42    if( (flags & B
8fa0: 54 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30  TREE_PRIVATE)==0
8fb0: 0a 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d  .   && isMemdb==
8fc0: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
8fd0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
8fe0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
8ff0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
9000: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
9010: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
9020: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
9030: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
9040: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
9050: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
9060: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
9070: 74 68 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  thname = (char *
9080: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
9090: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
90a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
90b0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
90c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
90d0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ble = 1;.      i
90e0: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20  f( db ){.       
90f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9100: 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65  LITE_SharedCache
9110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9120: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
9130: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
9140: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
9150: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9170: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9180: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
9190: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
91a0: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
91b0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
91c0: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
91d0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  d = sqlite3_mute
91e0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
91f0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
9200: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
9210: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
9220: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
9230: 20 20 20 66 6f 72 28 70 42 74 3d 73 71 6c 69 74     for(pBt=sqlit
9240: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
9250: 74 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  t; pBt; pBt=pBt-
9260: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
9270: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
9280: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
9290: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
92a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
92b0: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
92c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
92f0: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
9300: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
9310: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
9320: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
9330: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
9340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9350: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9360: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9370: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
9380: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
9390: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
93a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
93b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
93c0: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
93d0: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
93e0: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
93f0: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
9400: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
9410: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
9420: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
9430: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
9440: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
9450: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
9460: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
9470: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
9480: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
9490: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
94a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
94b0: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
94c0: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
94d0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
94e0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
94f0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
9500: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
9510: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
9520: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9530: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
9540: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
9550: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
9560: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
9570: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
9580: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
9590: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
95a0: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
95b0: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
95c0: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
95d0: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
95e0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
95f0: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
9600: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
9610: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
9620: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
9630: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
9640: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
9650: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
9660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9670: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
9680: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9690: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
96a0: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
96b0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
96c0: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
96d0: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
96e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
96f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9700: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
9710: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
9720: 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46   pBt->busyHdr.xF
9730: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
9740: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
9750: 6c 65 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75  ler;.    pBt->bu
9760: 73 79 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74  syHdr.pArg = pBt
9770: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
9780: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
9790: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
97a0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
97d0: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
97e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
97f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9810: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
9820: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
9830: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
9840: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
9850: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
9860: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9870: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
9880: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9890: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
98a0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
98b0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75  pPager, &pBt->bu
98c0: 73 79 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70  syHdr);.    p->p
98d0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
98e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
98f0: 44 65 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e  Destructor(pBt->
9900: 70 50 61 67 65 72 2c 20 70 61 67 65 44 65 73 74  pPager, pageDest
9910: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c  ructor);.    sql
9920: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
9930: 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  iter(pBt->pPager
9940: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
9950: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
9960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
9970: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
9980: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
9990: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
99a0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
99b0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
99c0: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
99d0: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
99e0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
99f0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
9a00: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
9a10: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9a20: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
9a30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
9a40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
9a50: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
9a60: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20  pageSize = 0;.  
9a70: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9a80: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
9a90: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
9aa0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
9ab0: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
9ac0: 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35 25  c = 64;   /* 25%
9ad0: 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d   */.      pBt->m
9ae0: 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33 32  inEmbedFrac = 32
9af0: 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a  ;   /* 12.5% */.
9b00: 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65        pBt->minLe
9b10: 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20  afFrac = 32;    
9b20: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e  /* 12.5% */.#ifn
9b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9b40: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
9b50: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
9b60: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
9b70: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
9b80: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
9b90: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
9ba0: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
9bb0: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
9bc0: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
9bd0: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
9be0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
9bf0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
9c00: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
9c10: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
9c20: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
9c30: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
9c40: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
9c50: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
9c60: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
9c70: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
9c80: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
9c90: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
9ca0: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
9cb0: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
9cc0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
9cd0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
9ce0: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
9cf0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
9d00: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
9d10: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
9d20: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
9d30: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
9d40: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
9d50: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
9d60: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
9d70: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
9d80: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
9d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
9da0: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
9db0: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
9dc0: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
9dd0: 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20  zDbHeader[21];. 
9de0: 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62       pBt->minEmb
9df0: 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  edFrac = zDbHead
9e00: 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20 20 70 42  er[22];.      pB
9e10: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
9e20: 20 7a 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a   zDbHeader[23];.
9e30: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
9e40: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
9e50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9e60: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
9e70: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
9e80: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
9e90: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
9ea0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
9eb0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9ec0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
9ed0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
9ee0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
9ef0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75      }.    pBt->u
9f00: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
9f10: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
9f20: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
9f30: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
9f40: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
9f50: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
9f60: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
9f70: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9f80: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
9f90: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
9fa0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69  ageSize);.   .#i
9fb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9fc0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
9fd0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
9fe0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
9ff0: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
a000: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
a010: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
a020: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
a030: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
a040: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
a050: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
a060: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a070: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
a080: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
a090: 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53   1;.      mutexS
a0a0: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  hared = sqlite3_
a0b0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
a0c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a0d0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
a0e0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
a0f0: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SAFE ){.        
a100: 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
a110: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a120: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a130: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
a140: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
a150: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a160: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a170: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
a180: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
a190: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
a1a0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a1d0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
a1e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
a1f0: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
a200: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a210: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
a220: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
a230: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
a240: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a250: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a260: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a270: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a280: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a290: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a2a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a2b0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a2c0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a2d0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a2e0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a2f0: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a300: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a310: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a320: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a330: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a340: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a350: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a360: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a370: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a380: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a390: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a3a0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a3b0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a3c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a3d0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
a3e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a3f0: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
a400: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
a410: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
a420: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
a430: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
a440: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
a450: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
a460: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a470: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
a480: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
a490: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
a4a0: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
a4b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a4c0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a4d0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
a4e0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
a4f0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a500: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
a510: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a520: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
a530: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
a540: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
a550: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
a560: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a570: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a580: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
a590: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
a5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a5b0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
a5c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a5e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a5f0: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
a600: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
a610: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
a620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a630: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
a640: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
a650: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
a660: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
a670: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a680: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
a690: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a6a0: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
a6b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a6c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
a6d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
a6e0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a6f0: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
a700: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
a710: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
a720: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
a730: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
a740: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
a750: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
a760: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
a770: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
a780: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
a790: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
a7a0: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
a7b0: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
a7c0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
a7d0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
a7e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a7f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a800: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a810: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
a820: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
a830: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
a840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a850: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
a860: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a870: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a880: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
a890: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
a8a0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
a8b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a8c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
a8d0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
a8e0: 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
a8f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a900: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d  haredCacheList==
a910: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
a920: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a930: 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ist = pBt->pNext
a940: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a950: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
a960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a970: 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
a980: 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
a990: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
a9a0: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
a9b0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
a9c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  }.      if( pLis
a9d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
a9e0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
a9f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
aa00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
aa10: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
aa20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aa30: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
aa40: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
aa50: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
aa60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
aa70: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
aa80: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
aa90: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
aaa0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
aab0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
aac0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
aad0: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
aae0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
aaf0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
ab00: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
ab10: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ab20: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
ab30: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
ab40: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
ab50: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
ab60: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
ab70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ab80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
ab90: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
aba0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
abb0: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
abc0: 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d   p->db;.  pCur =
abd0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
abe0: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
abf0: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
ac00: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
ac10: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
ac20: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
ac30: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
ac40: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ac50: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
ac60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ac70: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
ac80: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
ac90: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
aca0: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
acb0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
acc0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
acd0: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
ace0: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
acf0: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
ad00: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
ad10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
ad20: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
ad30: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ad40: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
ad50: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
ad60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
ad70: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
ad80: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
ad90: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
ada0: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
adb0: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
adc0: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
add0: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
ade0: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
adf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
ae00: 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
ae10: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
ae20: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
ae30: 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
ae40: 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
ae50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
ae60: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
ae70: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
ae80: 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
ae90: 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
aea0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
aeb0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
aec0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
aed0: 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
aee0: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
aef0: 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
af00: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
af10: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
af20: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
af30: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
af40: 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
af50: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
af60: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
af70: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
af80: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
af90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
afa0: 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63  e3_free(pBt->pSc
afb0: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
afc0: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
afd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
afe0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
aff0: 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
b000: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
b010: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
b020: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
b030: 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
b040: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
b050: 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
b060: 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
b070: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
b080: 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
b090: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b0a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b0b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
b0c0: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
b0d0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b0e0: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
b0f0: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
b100: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
b110: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
b120: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
b130: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
b140: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
b150: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
b160: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
b170: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
b180: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
b190: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
b1a0: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
b1b0: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
b1c0: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
b1d0: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
b1e0: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
b1f0: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
b200: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
b210: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
b220: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
b230: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
b240: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
b250: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
b260: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
b270: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
b280: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
b290: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
b2a0: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
b2b0: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
b2c0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
b2d0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
b2e0: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
b2f0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
b300: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
b310: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
b320: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
b330: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
b340: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b350: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
b360: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
b370: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
b380: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
b390: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
b3a0: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
b3b0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b3c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b3d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
b3e0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
b3f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
b400: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
b410: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
b420: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
b430: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
b440: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
b450: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b460: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
b470: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
b480: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
b490: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
b4a0: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
b4b0: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
b4c0: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
b4d0: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
b4e0: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
b4f0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
b500: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
b510: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
b520: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
b530: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
b540: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
b550: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
b560: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
b570: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
b580: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
b590: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
b5a0: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
b5b0: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
b5c0: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
b5d0: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
b5e0: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
b5f0: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
b600: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
b610: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
b620: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b630: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
b640: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
b650: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
b660: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
b670: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
b680: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
b690: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
b6a0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
b6b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b6c0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
b6d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
b6e0: 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
b6f0: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
b700: 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
b710: 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
b720: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
b730: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b750: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b760: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
b770: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
b780: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
b790: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
b7a0: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
b7b0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
b7c0: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
b7d0: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
b7e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b7f0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
b800: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
b810: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
b820: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
b830: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b840: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
b850: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
b860: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b870: 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
b880: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
b890: 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
b8a0: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
b8b0: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
b8c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b8d0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b8e0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
b8f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b900: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
b910: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b920: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
b930: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b940: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
b950: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
b960: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
b970: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
b980: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
b990: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
b9a0: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
b9b0: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
b9c0: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
b9d0: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
b9e0: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
b9f0: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
ba00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
ba10: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
ba20: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
ba30: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
ba40: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
ba50: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
ba60: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
ba70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ba80: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
ba90: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
baa0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
bab0: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
bac0: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
bad0: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
bae0: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
baf0: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
bb00: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
bb10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
bb20: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
bb30: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
bb40: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
bb50: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
bb60: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
bb70: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
bb80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bb90: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
bba0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
bbb0: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
bbc0: 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
bbd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bbe0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bbf0: 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
bc00: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
bc10: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
bc20: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
bc30: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
bc40: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
bc50: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
bc60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
bc70: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
bc80: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
bc90: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
bca0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
bcb0: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
bcc0: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
bcd0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
bce0: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
bcf0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
bd00: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
bd10: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
bd20: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
bd30: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
bd40: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
bd50: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
bd60: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
bd70: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
bd80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
bd90: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
bda0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
bdb0: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
bdc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
bdd0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bde0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
bdf0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
be00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
be10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
be20: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
be30: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
be40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
be50: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
be60: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
be70: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
be80: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
be90: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
bea0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
beb0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
bec0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
bed0: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
bee0: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
bef0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
bf00: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bf10: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
bf20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
bf30: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
bf40: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
bf50: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
bf60: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
bf70: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
bf80: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
bf90: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
bfa0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
bfb0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
bfc0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
bfd0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
bfe0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bff0: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
c000: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
c010: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
c020: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c030: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
c040: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
c050: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
c060: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
c070: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c080: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c090: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
c0a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c0b0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
c0c0: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
c0d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
c0e0: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
c0f0: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
c100: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
c110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c120: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
c130: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
c140: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
c150: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
c160: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
c170: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
c180: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
c190: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
c1a0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
c1b0: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
c1c0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
c1d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
c1e0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
c1f0: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
c200: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
c210: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
c220: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
c230: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
c240: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c250: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c260: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
c270: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c280: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
c290: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c2a0: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
c2b0: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20  Vacuum?1:0);..  
c2c0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c2d0: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
c2e0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
c2f0: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
c300: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
c310: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
c320: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
c330: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c340: 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  = av;.  }.  sqli
c350: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c360: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
c370: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
c380: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
c390: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
c3a0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
c3b0: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
c3c0: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
c3d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
c3e0: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
c3f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
c400: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c410: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
c420: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c430: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
c440: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
c450: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
c460: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
c470: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
c480: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
c490: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
c4a0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
c4b0: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
c4c0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
c4d0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
c4e0: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
c4f0: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
c500: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
c510: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c520: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
c530: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
c540: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
c550: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
c560: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
c570: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
c580: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
c590: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
c5a0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
c5b0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
c5c0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
c5d0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
c5e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
c5f0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
c600: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
c610: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
c620: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
c630: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
c640: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
c650: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
c660: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
c670: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
c680: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
c690: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
c6a0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
c6b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
c6c0: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
c6d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c6f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c700: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
c710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c720: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
c730: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
c740: 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
c750: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c760: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
c770: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
c780: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
c790: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
c7a0: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
c7b0: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
c7c0: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
c7d0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51   .  */.  rc = SQ
c7e0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69  LITE_NOTADB;.  i
c7f0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
c800: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
c810: 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 69  ager)>0 ){.    i
c820: 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  nt pageSize;.   
c830: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
c840: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
c850: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
c860: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
c870: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
c880: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
c890: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c8a0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c8b0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
c8c0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
c8d0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
c8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c8f0: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
c900: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
c910: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
c920: 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
c930: 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
c940: 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
c950: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c960: 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
c970: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
c980: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
c990: 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
c9a0: 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
c9b0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c9c0: 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
c9d0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c9e0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c9f0: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
ca00: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
ca10: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
ca20: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
ca30: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
ca40: 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
ca50: 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
ca60: 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
ca70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
ca80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
ca90: 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
caa0: 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
cab0: 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
cac0: 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
cad0: 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
cae0: 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
caf0: 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
cb00: 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
cb10: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
cb20: 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
cb30: 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
cb40: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
cb50: 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
cb60: 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
cb70: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
cb80: 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
cb90: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
cba0: 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
cbb0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cbc0: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
cbd0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
cbe0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
cbf0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
cc00: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
cc10: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
cc20: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
cc30: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
cc40: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  geSize);.      r
cc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
cc70: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
cc80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
cc90: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cca0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
ccb0: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
ccc0: 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
ccd0: 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
cce0: 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  ize;.    pBt->ma
ccf0: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  xEmbedFrac = pag
cd00: 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[21];.    pBt-
cd10: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
cd20: 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70  page1[22];.    p
cd30: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
cd40: 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66  = page1[23];.#if
cd50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cd60: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
cd70: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
cd80: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
cd90: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
cda0: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
cdb0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
cdc0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
cdd0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
cde0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
cdf0: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
ce00: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
ce10: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
ce20: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
ce30: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
ce40: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
ce50: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
ce60: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
ce70: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
ce80: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
ce90: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
cea0: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
ceb0: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
cec0: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
ced0: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
cee0: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
cef0: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
cf00: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
cf10: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
cf20: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
cf30: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
cf40: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
cf50: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
cf60: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
cf70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
cf80: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
cf90: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
cfa0: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
cfb0: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
cfc0: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
cfd0: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
cfe0: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
cff0: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
d000: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
d010: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
d020: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
d030: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
d040: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d050: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
d060: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
d070: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
d080: 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
d090: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
d0a0: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
d0b0: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
d0c0: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
d0d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
d0e0: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
d0f0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
d100: 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
d110: 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
d120: 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
d130: 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
d140: 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
d150: 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
d160: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d170: 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
d180: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
d190: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
d1a0: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
d1b0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
d1c0: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
d1d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
d1e0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
d1f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
d200: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
d210: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
d220: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d230: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
d240: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
d250: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
d260: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
d270: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
d280: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
d290: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
d2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
d2b0: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
d2c0: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
d2d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d2e0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
d2f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
d300: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
d310: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
d320: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
d330: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
d340: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
d350: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
d360: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
d370: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
d380: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d390: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
d3a0: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
d3b0: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
d3c0: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
d3d0: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
d3e0: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
d3f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
d400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d410: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
d420: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
d430: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
d440: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
d450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d460: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
d470: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
d480: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
d490: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
d4a0: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
d4b0: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
d4c0: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
d4d0: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
d4e0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d4f0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
d500: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
d510: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
d520: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d530: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
d540: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
d550: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
d560: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
d570: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
d580: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
d590: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
d5a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
d5b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
d5c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
d5d0: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
d5e0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d600: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
d610: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
d620: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
d630: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d640: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d650: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
d660: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
d670: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
d680: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
d690: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
d6a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d6b0: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
d6c0: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
d6d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
d6e0: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
d6f0: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
d700: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
d710: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
d720: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
d730: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
d740: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
d750: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
d760: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
d770: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
d780: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
d790: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
d7a0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
d7b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d7c0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
d7d0: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
d7e0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
d7f0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
d800: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
d810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
d820: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
d830: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
d840: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
d850: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
d860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
d870: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
d880: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
d890: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
d8a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
d8b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
d8c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d8d0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d8e0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73  utex) );.  if( s
d8f0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
d900: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
d910: 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  )>0 ) return SQL
d920: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20  ITE_OK;.  pP1 = 
d930: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
d940: 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
d950: 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
d960: 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
d970: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
d980: 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
d990: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d9a0: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
d9b0: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
d9c0: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
d9d0: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
d9e0: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
d9f0: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
da00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
da10: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
da20: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
da30: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
da40: 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d   1;.  data[20] =
da50: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
da60: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
da70: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70  ;.  data[21] = p
da80: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
da90: 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70  ;.  data[22] = p
daa0: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
dab0: 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70  ;.  data[23] = p
dac0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b  Bt->minLeafFrac;
dad0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
dae0: 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
daf0: 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
db00: 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
db10: 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
db20: 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  A );.  pBt->page
db30: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
db40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
db60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
db70: 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
db80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
db90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
dba0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
dbb0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
dbc0: 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
dbd0: 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
dbe0: 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
dbf0: 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
dc00: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
dc10: 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
dc20: 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  uum);.#endif.  r
dc30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
dc50: 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
dc60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
dc70: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
dc80: 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
dc90: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
dca0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
dcb0: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
dcc0: 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
dcd0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
dce0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
dcf0: 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
dd00: 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
dd10: 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
dd20: 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
dd30: 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
dd40: 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
dd50: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
dd60: 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
dd70: 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
dd80: 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
dd90: 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
dda0: 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
ddb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
ddc0: 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
ddd0: 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
dde0: 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
ddf0: 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
de00: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
de10: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
de20: 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
de30: 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
de40: 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
de50: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
de60: 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
de70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
de80: 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
de90: 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
dea0: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
deb0: 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
dec0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ded0: 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
dee0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
def0: 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
df00: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
df10: 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
df20: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
df30: 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
df40: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
df50: 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
df60: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
df70: 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
df80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
df90: 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
dfa0: 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
dfb0: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
dfc0: 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
dfd0: 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
dfe0: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
dff0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
e000: 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
e010: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
e020: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
e030: 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
e040: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
e050: 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
e060: 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
e070: 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
e080: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
e090: 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
e0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
e0b0: 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
e0c0: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
e0d0: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
e0e0: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
e0f0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
e100: 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
e110: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
e120: 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
e130: 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
e140: 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
e150: 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
e160: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
e170: 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
e180: 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
e190: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
e1a0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
e1b0: 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
e1c0: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e1d0: 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
e1e0: 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
e1f0: 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
e200: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
e210: 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
e220: 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
e230: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
e240: 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
e250: 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
e260: 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
e270: 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
e280: 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
e290: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
e2a0: 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
e2b0: 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
e2c0: 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
e2d0: 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
e2e0: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
e2f0: 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
e300: 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
e310: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e320: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
e330: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
e340: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e350: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
e360: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65   = p->db;.  btre
e370: 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
e380: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
e390: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
e3a0: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
e3b0: 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
e3c0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
e3d0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
e3e0: 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
e3f0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
e400: 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
e410: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
e420: 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
e430: 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
e440: 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
e450: 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
e460: 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
e470: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
e480: 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
e490: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
e4a0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
e4b0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
e4c0: 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
e4d0: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
e4e0: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
e4f0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
e500: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
e510: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
e520: 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
e530: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
e540: 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
e550: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
e560: 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
e570: 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
e580: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
e590: 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
e5a0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
e5b0: 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
e5c0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
e5d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
e5e0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
e5f0: 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72  RANS_WRITE && wr
e600: 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
e610: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e620: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
e630: 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
e640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
e650: 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
e660: 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
e670: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
e680: 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
e690: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
e6a0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
e6b0: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
e6c0: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
e6d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e6e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
e6f0: 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
e700: 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  begun;.      }. 
e710: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e720: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 77 68 69 6c  .  do {.    whil
e730: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
e740: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 3d   && pBt->pPage1=
e750: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
e760: 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b   lockBtree(pBt);
e770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e780: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e790: 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
e7a0: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
e7b0: 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
e7c0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
e7d0: 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
e7e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e7f0: 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
e800: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
e810: 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b  Page, wrflag>1);
e820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
e830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e840: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
e850: 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
e860: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e870: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
e880: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e890: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  ){.      if( wrf
e8a0: 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d  lag ) pBt->inStm
e8b0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
e8c0: 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
e8d0: 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
e8e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
e8f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
e900: 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
e910: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
e920: 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
e930: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76   sqlite3BtreeInv
e940: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
e950: 42 74 2c 20 30 29 20 29 3b 0a 0a 20 20 69 66 28  Bt, 0) );..  if(
e960: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e970: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
e980: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
e990: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
e9a0: 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
e9b0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
e9c0: 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
e9d0: 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
e9e0: 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
e9f0: 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
ea00: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
ea10: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
ea20: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
ea30: 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
ea40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ea50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
ea60: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
ea70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ea80: 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65  !pBt->pExclusive
ea90: 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
eaa0: 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20  Exclusive = p;. 
eab0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
eac0: 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
ead0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
eae0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
eaf0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
eb00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
eb10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eb20: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
eb30: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
eb40: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
eb50: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
eb60: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
eb70: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
eb80: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
eb90: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
eba0: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
ebb0: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
ebc0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
ebd0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
ebe0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
ebf0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
ec00: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
ec10: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
ec20: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
ec50: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
ec60: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ec80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
ec90: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
eca0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ecd0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
ece0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
ecf0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
ed00: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
ed10: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
ed20: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
ed30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
ed40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ed50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
ed60: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
ed70: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
ed80: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
ed90: 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
eda0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
edb0: 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
edc0: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
edd0: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
ede0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
edf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ee00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
ee10: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
ee20: 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
ee30: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
ee40: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
ee50: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
ee60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ee70: 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
ee80: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
ee90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
eea0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
eeb0: 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
eec0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
eed0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
eee0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
eef0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
ef00: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
ef10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ef20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
ef30: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
ef40: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
ef50: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
ef60: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
ef70: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
ef80: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
ef90: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
efa0: 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
efb0: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
efc0: 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
efd0: 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
efe0: 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
eff0: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
f000: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
f010: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
f020: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f030: 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
f040: 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
f050: 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
f060: 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
f070: 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
f080: 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
f090: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
f0a0: 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
f0b0: 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
f0c0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
f0d0: 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
f0e0: 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
f0f0: 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
f100: 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
f110: 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
f120: 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
f130: 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
f140: 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
f150: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
f160: 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
f170: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f180: 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
f190: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
f1a0: 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
f1b0: 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
f1c0: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
f1d0: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
f1e0: 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
f1f0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
f200: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
f210: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
f220: 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
f230: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
f240: 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
f250: 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
f260: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f270: 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
f2a0: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
f2b0: 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
f2c0: 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
f2d0: 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
f2e0: 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
f2f0: 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
f300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f310: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
f320: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f330: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
f340: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
f350: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
f360: 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
f370: 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
f380: 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
f390: 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
f3a0: 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
f3b0: 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
f3c0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
f3d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f3e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f3f0: 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
f400: 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
f410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f420: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
f430: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
f440: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
f450: 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
f460: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
f470: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e  pPage, 0);.    n
f480: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
f490: 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
f4a0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
f4b0: 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
f4c0: 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
f4d0: 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
f4e0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
f4f0: 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
f500: 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
f510: 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  fo;.        sqli
f520: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
f530: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
f540: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
f550: 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
f560: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
f570: 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
f580: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
f590: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
f5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
f5b0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
f5c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
f5d0: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
f5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f5f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f610: 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
f620: 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
f630: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
f640: 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
f650: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
f660: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
f680: 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
f690: 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
f6a0: 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
f6b0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
f6c0: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
f6d0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
f6e0: 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
f6f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f700: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f710: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
f720: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
f730: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
f740: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
f750: 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
f760: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
f770: 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
f780: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f790: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
f7a0: 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
f7b0: 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
f7c0: 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
f7d0: 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
f7e0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
f7f0: 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
f800: 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
f810: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
f820: 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
f830: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
f840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
f850: 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
f860: 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
f870: 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
f880: 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
f890: 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
f8a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
f8b0: 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
f8c0: 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
f8d0: 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
f8f0: 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
f900: 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
f910: 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
f920: 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20  iFreePage       
f930: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
f940: 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
f950: 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d  age to */.){.  M
f960: 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
f970: 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
f980: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
f990: 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
f9a0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
f9b0: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
f9c0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
f9d0: 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
f9e0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
f9f0: 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
fa00: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
fa10: 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
fa20: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
fa30: 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
fa40: 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
fa50: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
fa60: 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
fa70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fa80: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
fa90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
faa0: 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
fab0: 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
fac0: 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
fad0: 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
fae0: 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
faf0: 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
fb00: 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
fb10: 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
fb20: 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
fb30: 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
fb40: 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
fb50: 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
fb60: 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
fb70: 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
fb80: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
fb90: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
fba0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
fbb0: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
fbc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fbd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
fbe0: 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
fbf0: 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
fc00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
fc10: 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
fc20: 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
fc30: 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
fc40: 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
fc50: 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
fc60: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
fc70: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
fc80: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
fc90: 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
fca0: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
fcb0: 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
fcc0: 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
fcd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
fce0: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
fcf0: 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
fd00: 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
fd10: 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
fd20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
fd30: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
fd40: 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
fd50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
fd60: 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
fd70: 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
fd80: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
fd90: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
fda0: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
fdb0: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
fdc0: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
fdd0: 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
fde0: 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
fdf0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
fe00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fe10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fe20: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
fe30: 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
fe40: 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
fe50: 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
fe60: 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
fe70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
fe80: 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
fe90: 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
fea0: 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
feb0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
fec0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
fee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fef0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
ff00: 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
ff10: 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
ff20: 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
ff30: 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
ff40: 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
ff50: 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
ff60: 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
ff70: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
ff80: 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
ff90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
ffa0: 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
ffb0: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
ffc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ffd0: 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
ffe0: 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
fff0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10020 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10030 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
10040 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
10050 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10070 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10080 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
10090 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
100a0 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
100b0 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
100c0 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
100d0 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
100e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
100f0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
10100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10110 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
10120 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
10130 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
10140 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
10150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10160 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
10170 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
10180 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
10190 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
101a0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
101b0 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
101c0 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
101d0 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
101e0 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
101f0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
10200 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
10210 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
10220 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
10230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
10240 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
10250 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
10260 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
10270 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
10280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
10290 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
102a0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
102b0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
102c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
102d0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
102e0 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
102f0 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
10300 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
10310 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
10320 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
10330 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
10340 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10350 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
10360 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
10370 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
10380 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
10390 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
103a0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
103b0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
103c0 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
103d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
103e0 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
103f0 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
10400 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
10410 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
10420 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
10430 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
10440 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
10450 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
10460 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
10470 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
10480 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
10490 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
104a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
104b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
104c0 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
104d0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
104e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
104f0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
10500 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
10510 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
10520 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10530 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10540 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e   iLastPg = pBt->
10550 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c  nTrunc;.  if( iL
10560 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  astPg==0 ){.    
10570 69 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65  iLastPg = sqlite
10580 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10590 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
105a0 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
105b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
105c0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
105d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
105e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
105f0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
10600 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
10610 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
10620 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
10630 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
10640 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
10650 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
10660 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
10670 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
10680 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10690 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
106a0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
106b0 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
106c0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
106d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
106e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
106f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10700 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
10710 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
10720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10730 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10740 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
10750 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
10760 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
10770 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
10780 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
10790 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
107a0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
107b0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
107c0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
107d0 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
107e0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
107f0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
10800 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
10810 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
10820 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
10830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
10840 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
10850 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
10860 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
10870 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
10880 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
10890 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
108a0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
108b0 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
108c0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
108d0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
108e0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
108f0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
10900 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
10910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10940 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
10960 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
10970 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
10980 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
10990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
109a0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
109b0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
109c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
109d0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
109e0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
109f0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
10a00 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
10a10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10a20 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
10a30 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
10a40 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
10a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10a70 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
10a80 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
10a90 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
10aa0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
10ab0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
10ac0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
10ad0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
10ae0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
10af0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
10b00 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
10b10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
10b20 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
10b30 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
10b40 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
10b50 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
10b60 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
10b70 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
10b80 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
10b90 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
10ba0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
10bb0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
10bc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
10bd0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
10be0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
10bf0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
10c00 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
10c10 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
10c20 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10c50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
10c60 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
10c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10c80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
10c90 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
10ca0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
10cb0 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
10cc0 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
10cd0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10ce0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
10cf0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
10d00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10d10 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
10d20 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
10d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
10d50 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
10d60 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
10d70 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
10d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10d90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
10da0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
10db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10dc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10dd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
10de0 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e   }.  }..  pBt->n
10df0 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67 20  Trunc = iLastPg 
10e00 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 42  - 1;.  while( pB
10e10 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49  t->nTrunc==PENDI
10e20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
10e30 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
10e40 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e  (pBt, pBt->nTrun
10e50 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e  c) ){.    pBt->n
10e60 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Trunc--;.  }.  r
10e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
10e90 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
10ea0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
10eb0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
10ec0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
10ed0 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
10ee0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
10ef0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
10f00 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
10f10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
10f20 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
10f30 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
10f40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
10f50 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
10f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
10f70 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
10f80 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
10f90 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  o error occured,
10fa0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
10fb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10fc0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
10fd0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
10fe0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
10ff0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
11000 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
11010 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11020 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
11030 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11040 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
11050 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
11060 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11070 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
11080 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
11090 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
110a0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
110b0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
110c0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
110d0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
110e0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
110f0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
11100 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11110 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
11120 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11130 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11140 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11150 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11160 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
11170 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
11180 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11190 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
111a0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
111b0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
111c0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
111d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
111e0 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
111f0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
11200 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
11210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11220 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
11230 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
11240 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
11250 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
11260 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
11270 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
11280 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
11290 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
112a0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
112b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
112c0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
112d0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
112e0 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
112f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11300 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
11310 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
11320 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
11330 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
11340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
11350 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
11360 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11370 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11380 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11390 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
113a0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
113b0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
113c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
113d0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
113e0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
113f0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
11400 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
11410 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
11420 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
11430 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
11440 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
11450 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
11460 53 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Size;.      Pgno
11470 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33   nOrig = sqlite3
11480 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11490 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
114a0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
114b0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
114c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
114d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
114e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
114f0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
11500 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
11510 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11520 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
11530 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
11540 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
11550 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11560 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
11570 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
11580 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
11590 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
115a0 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
115b0 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
115c0 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
115d0 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
115e0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
115f0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
11600 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
11610 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
11620 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
11630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
11640 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
11650 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
11660 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
11670 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11680 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
11690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
116a0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
116b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
116c0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
116d0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
116e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
116f0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
11700 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
11710 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
11720 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
11730 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
11740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11750 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
11760 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
11770 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11780 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
11790 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
117a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
117b0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
117c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
117d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
117e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
117f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
11800 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  .        pBt->nT
11810 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  runc = nFin;.   
11820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11840 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11850 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
11860 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
11870 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
11880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
11890 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54  nTrunc = pBt->nT
118a0 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  runc;.    pBt->n
118b0 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunc = 0;.  }. 
118c0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
118d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
118e0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
118f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11900 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
11910 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
11920 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
11930 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
11940 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
11950 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
11960 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11970 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
11980 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
11990 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
119a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
119b0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
119c0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
119d0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
119e0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
119f0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
11a00 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
11a10 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
11a20 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
11a30 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
11a40 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
11a50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
11a60 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
11a70 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
11a80 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
11a90 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
11aa0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
11ab0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
11ac0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
11ad0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
11ae0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
11af0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
11b00 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
11b10 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
11b20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
11b30 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
11b40 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
11b50 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
11b60 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
11b70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11b80 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
11b90 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
11ba0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
11bb0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
11bc0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
11bd0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
11be0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
11bf0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
11c00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11c10 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
11c20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
11c30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
11c40 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
11c50 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
11c60 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
11c70 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
11c80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
11c90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11ca0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
11cb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
11cc0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
11cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
11ce0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
11cf0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
11d00 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
11d10 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
11d20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
11d30 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
11d40 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
11d50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
11d60 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
11d70 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
11d80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11d90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
11da0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
11db0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
11dc0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
11dd0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
11de0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
11df0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
11e00 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
11e10 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
11e20 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
11e30 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
11e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
11e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11e60 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11e70 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
11e80 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11ea0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
11eb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
11ec0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
11ed0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11ee0 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
11ef0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nc = 0;.    sqli
11f00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11f10 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
11f20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
11f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11f40 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
11f50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
11f60 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
11f70 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
11f80 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20  , &nTrunc); .   
11f90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11fa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11fb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11fc0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
11fd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
11fe0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12000 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
12010 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
12020 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20  Master, nTrunc, 
12030 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
12040 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12050 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12060 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
12070 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
12080 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
12090 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
120a0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
120b0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
120c0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
120d0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
120e0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  * sqlite3BtreeSy
120f0 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  nc() routine doe
12100 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
12110 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  e and should be 
12120 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72  invoked.** prior
12130 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
12140 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
12150 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12160 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a  ) routine did.**
12170 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
12180 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
12190 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
121a0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
121b0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
121c0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
121d0 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
121e0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
121f0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
12200 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
12210 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
12220 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  te the rollback 
12230 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63  journal.** (whic
12240 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
12250 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
12260 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63  it) and drop loc
12270 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
12280 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
12290 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
122a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
122b0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
122c0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
122d0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
122e0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
122f0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
12300 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12310 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
12320 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12330 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
12340 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12350 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
12360 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
12370 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
12380 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
12390 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
123a0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
123b0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
123c0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
123d0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
123e0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
123f0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
12400 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12410 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12420 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
12430 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
12440 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12450 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
12460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12470 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
12480 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
12490 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
124a0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
124b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
124c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
124d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
124e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
124f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12500 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
12510 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
12520 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74  NS_READ;.    pBt
12530 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
12540 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  }.  unlockAllTab
12550 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  les(p);..  /* If
12560 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
12570 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
12580 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
12590 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
125a0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
125b0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
125c0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
125d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
125e0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
125f0 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
12600 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12610 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
12620 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
12630 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
12640 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
12650 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
12660 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
12670 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  NS_NONE ){.    p
12680 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
12690 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
126a0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
126b0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
126c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
126d0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
126e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
126f0 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
12700 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
12710 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
12720 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
12730 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
12740 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
12750 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
12760 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
12770 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ion..  */.  p->i
12780 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
12790 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ONE;.  unlockBtr
127a0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
127b0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
127c0 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
127d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
127e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
12800 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
12810 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
12820 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
12830 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
12840 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
12850 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12870 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
12880 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
12890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
128a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
128b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
128c0 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wo(p);.  }.  sql
128d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
128e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
128f0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
12900 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
12910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
12920 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
12930 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
12940 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
12950 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
12960 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
12970 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
12980 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
12990 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
129a0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
129b0 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
129c0 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d  outine, a write-
129d0 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
129e0 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
129f0 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69  capable of writi
12a00 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73  ng to the databs
12a10 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  e.  That means t
12a20 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
12a30 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
12a40 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ed for writing a
12a50 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  nd the cursor ha
12a60 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65  s not be disable
12a70 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69  d.** by having i
12a80 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64  ts state changed
12a90 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
12aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ab0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
12ac0 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
12ad0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
12ae0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
12af0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
12b00 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
12b10 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
12b20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
12b30 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d  >wrFlag && pCur-
12b40 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
12b50 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
12b60 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
12b70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12b80 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
12b90 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
12ba0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
12bb0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
12bc0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
12bd0 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42  very cursor on B
12be0 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
12bf0 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
12c00 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  s..**.** Every c
12c10 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64  ursor is tripped
12c20 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
12c30 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a  ors that belong.
12c40 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ** to other data
12c50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
12c60 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
12c70 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68  be sharing.** th
12c80 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
12c90 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
12ca0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
12cb0 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
12cc0 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41  ack occurs..** A
12cd0 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67  ll cursors using
12ce0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20   the same cache 
12cf0 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a  must be tripped.
12d00 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
12d10 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  em from trying t
12d20 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20  o use the btree 
12d30 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c  after.** the rol
12d40 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c  lback.  The roll
12d50 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
12d60 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20  leted tables.** 
12d70 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61  or moved root pa
12d80 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f  ges, so it is no
12d90 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a  t sufficient to.
12da0 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74  ** save the stat
12db0 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
12dc0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
12dd0 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  t be.** invalida
12de0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
12df0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
12e00 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
12e10 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
12e20 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
12e30 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
12e40 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
12e50 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
12e60 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
12e70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
12e80 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
12e90 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70  sition(p);.    p
12ea0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
12eb0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
12ec0 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
12ed0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
12ee0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
12ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
12f00 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
12f10 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
12f20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
12f30 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
12f40 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
12f50 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
12f60 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
12f70 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
12f80 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
12f90 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
12fa0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
12fb0 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
12fc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
12fd0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
12fe0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
12ff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13000 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
13010 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
13020 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
13030 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
13040 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
13050 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
13060 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13070 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13080 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13090 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
130a0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
130b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
130c0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
130d0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
130e0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
130f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13100 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13120 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
13130 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
13140 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
13150 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
13160 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
13170 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
13180 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
13190 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
131a0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
131b0 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
131c0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
131d0 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
131e0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
131f0 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
13200 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
13210 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
13220 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
13230 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
13240 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
13250 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
13260 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
13270 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
13280 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
13290 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
132a0 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
132b0 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
132c0 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
132d0 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
132e0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
132f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13300 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
13310 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , rc);.  }.#endi
13320 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
13330 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
13340 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
13350 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13360 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
13370 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66     int rc2;..#if
13380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13390 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
133a0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
133b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
133c0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
133d0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
133e0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
133f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
13400 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
13410 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
13420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13430 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
13440 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13450 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
13460 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
13470 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
13480 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
13490 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
134a0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
134b0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
134c0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
134d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
134e0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
134f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13500 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13510 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13520 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
13530 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13540 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13550 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
13560 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
13570 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
13580 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13590 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
135a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
135b0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
135c0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
135d0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
135e0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
135f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
13600 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
13610 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
13620 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13630 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
13640 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
13650 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
13660 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13670 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
13680 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
13690 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
136a0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
136b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
136c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
136d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
136e0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
136f0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
13700 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73  n.  The subtrans
13710 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61  action can.** ca
13720 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
13730 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
13740 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
13750 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d  action..** You m
13760 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
13770 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73  saction before s
13780 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
13790 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
137a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
137b0 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
137c0 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61  ically if the ma
137d0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  in transaction.*
137e0 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  * commits or rol
137f0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  ls back..**.** O
13800 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73  nly one subtrans
13810 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
13820 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20  tive at a time. 
13830 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
13840 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61  to try.** to sta
13850 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e  rt a new subtran
13860 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68  saction if anoth
13870 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  er subtransactio
13880 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
13890 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ive..**.** State
138a0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
138b0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
138c0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
138d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
138e0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
138f0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
13900 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
13910 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
13920 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
13930 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
13940 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
13950 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
13960 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
13970 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
13980 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
13990 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
139a0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
139b0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
139c0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
139d0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
139e0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
139f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13a00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13a10 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
13a20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
13a30 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
13a40 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
13a50 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
13a60 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
13a70 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
13a80 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
13a90 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
13aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13ab0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13ac0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
13ad0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
13ae0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
13af0 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
13b00 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
13b10 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
13b20 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
13b30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13b40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13b50 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13b60 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
13b70 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13b80 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
13b90 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
13ba0 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
13bb0 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
13bc0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
13bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13be0 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
13bf0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
13c00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13c10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
13c20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13c30 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
13c40 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74  p->db;.  if( pBt
13c50 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
13c60 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
13c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13c80 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
13c90 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
13ca0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
13cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
13cc0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
13cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13ce0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13cf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
13d00 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
13d10 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
13d20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
13d30 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
13d40 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
13d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13d60 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
13d70 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
13d80 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
13d90 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
13da0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
13db0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
13dc0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
13dd0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
13de0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
13df0 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
13e00 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
13e10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13e20 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
13e30 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13e40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13e50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13e60 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13e70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13e80 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13e90 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
13ea0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
13eb0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13ec0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13ed0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
13ee0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  ->pPager);.    a
13ef0 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
13f00 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
13f10 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   );.    pBt->inS
13f20 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
13f30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13f40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13f60 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
13f70 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
13f80 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
13f90 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
13fa0 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
13fb0 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
13fc0 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
13fd0 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
13fe0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
13ff0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
14000 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14010 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
14020 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
14030 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
14040 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
14050 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
14060 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
14070 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
14080 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
14090 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
140a0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
140b0 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
140c0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
140d0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
140e0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
140f0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
14100 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
14110 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
14120 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
14130 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
14140 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
14150 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
14160 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
14170 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
14180 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
14190 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
141a0 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
141b0 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
141c0 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
141d0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
141e0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
141f0 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
14200 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
14210 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
14220 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
14230 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
14240 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
14250 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
14260 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
14270 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
14280 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
14290 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
142a0 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
142b0 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
142c0 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
142d0 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
142e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
142f0 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
14300 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
14310 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
14320 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
14330 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
14340 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
14350 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
14360 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
14370 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
14380 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
14390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
143a0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
143b0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
143c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
143d0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
143e0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14400 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
14410 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
14420 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
14450 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
14460 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
14470 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
14480 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
14490 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
144a0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
144b0 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20  or **ppCur      
144c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
144d0 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
144e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
144f0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
14500 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  Cur;.  BtShared 
14510 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
14520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14530 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
14540 28 70 29 20 29 3b 0a 20 20 2a 70 70 43 75 72 20  (p) );.  *ppCur 
14550 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  = 0;.  if( wrFla
14560 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
14570 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14590 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
145a0 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
145b0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
145c0 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
145d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
145e0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  CKED;.    }.  }.
145f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
14600 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e1==0 ){.    rc 
14610 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  = lockBtreeWithR
14620 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28  etry(p);.    if(
14630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14640 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14650 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14660 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
14670 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  & wrFlag ){.    
14680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14690 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
146a0 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
146b0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
146c0 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
146d0 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
146e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
146f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
14700 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
14710 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
14720 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
14730 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
14740 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
14750 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
14760 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
14770 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
14780 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
14790 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
147a0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
147b0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
147c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
147d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
147e0 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
147f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
14800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14810 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
14820 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
14830 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
14840 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
14850 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
14860 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
14870 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
14880 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b   variables, link
14890 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
148a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
148b0 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75  st and set *ppCu
148c0 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70  r (the.  ** outp
148d0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
148e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20  his function).. 
148f0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79   */.  pCur->pKey
14900 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
14910 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
14920 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
14930 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
14940 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
14950 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
14960 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
14970 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14980 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
14990 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
149a0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
149b0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
149c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
149d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
149e0 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a   *ppCur = pCur;.
149f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14a00 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
14a10 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
14a20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
14a30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
14a40 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 73  r->pPage);.    s
14a50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
14a60 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42  );.  }.  unlockB
14a70 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
14a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14a90 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
14aa0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
14ab0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
14ad0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
14ae0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
14af0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
14b00 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
14b10 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
14b20 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
14b30 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
14b40 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
14b50 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
14b60 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
14b70 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
14b80 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
14b90 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75   BtCursor **ppCu
14ba0 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
14bb0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
14bc0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
14bd0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
14be0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14bf0 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
14c00 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
14c10 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
14c20 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
14c30 66 6f 2c 20 70 70 43 75 72 29 3b 0a 20 20 73 71  fo, ppCur);.  sq
14c40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14c50 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14c60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  .}.../*.** Close
14c70 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
14c80 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
14c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14ca0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
14cb0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
14cc0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
14cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14ce0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
14cf0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
14d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14d10 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 42 74 72  pCur->pBt;.  Btr
14d20 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
14d30 72 2d 3e 70 42 74 72 65 65 3b 0a 0a 20 20 73 71  r->pBtree;..  sq
14d40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14d50 70 42 74 72 65 65 29 3b 0a 20 20 70 42 74 2d 3e  pBtree);.  pBt->
14d60 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
14d70 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f  .  clearCursorPo
14d80 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
14d90 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
14da0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72  ){.    pCur->pPr
14db0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
14dc0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
14dd0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  {.    pBt->pCurs
14de0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
14df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
14e00 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
14e10 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
14e20 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
14e30 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
14e40 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
14e50 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14e60 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
14e70 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
14e80 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
14e90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
14ea0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
14eb0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
14ec0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14ed0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
14ee0 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
14ef0 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
14f00 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
14f10 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
14f20 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
14f30 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
14f40 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
14f50 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
14f60 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
14f70 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42  eGetTempCursor(B
14f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42  tCursor *pCur, B
14f90 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75  tCursor *pTempCu
14fa0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
14fb0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
14fc0 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  Cur) );.  memcpy
14fd0 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c  (pTempCur, pCur,
14fe0 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b   sizeof(*pCur));
14ff0 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65  .  pTempCur->pNe
15000 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43  xt = 0;.  pTempC
15010 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ur->pPrev = 0;. 
15020 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70   if( pTempCur->p
15030 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Page ){.    sqli
15040 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d  te3PagerRef(pTem
15050 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62  pCur->pPage->pDb
15060 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
15070 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d  .** Delete a tem
15080 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75  porary cursor su
15090 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62  ch as was made b
150a0 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70  y the CreateTemp
150b0 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a  oraryCursor().**
150c0 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e   function above.
150d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
150e0 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
150f0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
15100 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
15110 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
15120 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
15130 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  ( pCur->pPage ){
15140 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
15150 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61  rUnref(pCur->pPa
15160 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
15170 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
15180 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
15190 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
151a0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
151b0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
151c0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
151d0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
151e0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
151f0 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  ll.** sqlite3Btr
15200 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
15210 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
15220 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
15230 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
15240 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
15250 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
15260 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
15270 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
15280 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
15290 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
152a0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
152b0 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
152c0 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
152d0 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
152e0 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
152f0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
15300 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
15310 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
15320 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
15330 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
15340 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
15350 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
15360 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
15370 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
15380 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
15390 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
153a0 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
153b0 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
153c0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
153d0 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
153e0 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
153f0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
15400 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
15410 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
15420 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
15430 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
15440 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
15450 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
15460 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
15470 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
15480 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15490 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
154a0 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  o;.    memset(&i
154b0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
154c0 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  nfo));.    sqlit
154d0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
154e0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
154f0 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b  ur->idx, &info);
15500 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
15510 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
15520 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
15530 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
15540 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
15550 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
15560 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
15570 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
15580 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
15590 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
155a0 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
155b0 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
155c0 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
155d0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
155e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
155f0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
15600 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
15610 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
15620 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
15630 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
15640 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
15650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15660 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
15670 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
15680 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
15690 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
156a0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
156b0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
156c0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
156d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
156e0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
156f0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15730 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
15740 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
15780 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15790 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
157a0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
157b0 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20  ur->info);      
157c0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15810 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
15820 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
15860 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
15870 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
15880 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
15890 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
158a0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
158b0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
158c0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
158d0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
158e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
158f0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
15900 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
15910 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
15920 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
15930 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
15940 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
15950 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
15960 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
15970 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
15980 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15990 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
159a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
159b0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
159c0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
159d0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
159e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
159f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15a00 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
15a10 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
15a20 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
15a30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
15a50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
15a60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
15a70 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
15a80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
15a90 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
15aa0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15ab0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
15ac0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
15ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
15ae0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
15af0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
15b00 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
15b10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15b20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
15b30 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
15b40 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
15b50 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
15b60 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
15b70 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
15b80 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
15b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15ba0 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
15bb0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
15bc0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
15bd0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
15be0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
15bf0 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
15c00 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
15c10 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
15c20 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
15c30 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
15c40 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
15c50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15c60 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
15c70 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
15c80 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
15c90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
15ca0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15cb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
15cc0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
15cd0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
15ce0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
15d00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
15d10 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
15d20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
15d30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
15d40 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
15d50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15d60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
15d70 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
15d80 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
15d90 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
15da0 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
15db0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
15dc0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
15dd0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
15de0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
15df0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
15e00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15e10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
15e20 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
15e30 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
15e40 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
15e50 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
15e60 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
15e70 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
15e80 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15e90 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15ea0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
15eb0 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
15ec0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
15ed0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
15ee0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
15ef0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
15f00 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
15f10 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
15f20 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
15f30 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
15f40 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15f50 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
15f60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15f70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
15f80 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50  .**.** Unless pP
15f90 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c  gnoNext is NULL,
15fa0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15fb0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
15fc0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69  rflow .** page i
15fd0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
15fe0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
15ff0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
16000 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74  age ovfl.** is t
16010 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
16020 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c  its linked list,
16030 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
16040 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
16050 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
16060 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67  not NULL, *ppPag
16070 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
16080 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a  MemPage* handle.
16090 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c  ** for page ovfl
160a0 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  . The underlying
160b0 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20   pager page may 
160c0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
160d0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
160e0 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73  noContent flag s
160f0 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20  et, so the page 
16100 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20  data accessable 
16110 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64  via.** this hand
16120 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  le may not be tr
16130 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
16140 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
16150 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
16160 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f   *pBt, .  Pgno o
16170 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
16180 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c         /* Overfl
16190 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  ow page */.  Mem
161a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
161b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
161c0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
161d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
161e0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
161f0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
16200 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
16210 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
16220 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e  o next = 0;.  in
16230 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16250 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16260 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  );.  /* One of t
16270 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  hese must not be
16280 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
16290 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20  , why call this 
162a0 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61  function? */.  a
162b0 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20  ssert(ppPage || 
162c0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f  pPgnoNext);..  /
162d0 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69  * If pPgnoNext i
162e0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
162f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
16300 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62  ing called to ob
16310 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50  tain.  ** a MemP
16320 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f  age* reference o
16330 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74  nly. No page-dat
16340 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  a is required in
16350 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f   this case..  */
16360 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78  .  if( !pPgnoNex
16370 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16380 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16390 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70  age(pBt, ovfl, p
163a0 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a  pPage, 1);.  }..
163b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
163c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
163d0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
163e0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
163f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
16400 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
16410 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
16420 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
16430 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
16440 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
16450 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
16460 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
16470 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
16480 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
16490 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
164a0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
164b0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
164c0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
164d0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
164e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
164f0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
16500 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
16510 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
16520 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
16530 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
16540 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
16550 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
16560 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
16570 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
16580 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
16590 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
165a0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
165b0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
165c0 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74  f( iGuess<=sqlit
165d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
165e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
165f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
16600 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
16610 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
16620 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
16630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16660 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
16670 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
16680 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
16690 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
166a0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
166b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
166c0 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70  f( next==0 || pp
166d0 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50  Page ){.    MemP
166e0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
166f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16700 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
16710 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
16720 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61   next!=0);.    a
16730 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
16740 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29  _OK || pPage==0)
16750 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d  ;.    if( next==
16760 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
16770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
16780 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
16790 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
167a0 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65  ..    if( ppPage
167b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
167c0 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d  e = pPage;.    }
167d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65  else{.      rele
167e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
167f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67      }.  }.  *pPg
16800 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a  noNext = next;..
16810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16820 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
16830 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
16840 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
16850 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
16860 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
16870 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
16880 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
16890 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
168a0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
168b0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
168c0 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
168d0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
168e0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
168f0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
16900 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
16910 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
16920 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
16930 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
16940 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
16950 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
16960 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
16970 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
16980 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
16990 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
169a0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
169b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
169c0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
169d0 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
169e0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
169f0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
16a00 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
16a10 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
16a20 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
16a30 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
16a40 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
16a50 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16a60 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
16a70 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
16a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16a90 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
16aa0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
16ab0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16ac0 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
16ad0 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
16ae0 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
16af0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
16b00 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
16b10 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
16b20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
16b30 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
16b40 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
16b50 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
16b60 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
16b70 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
16b80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16b90 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
16ba0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16bc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16bd0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
16be0 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
16bf0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
16c00 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
16c10 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
16c20 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
16c30 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
16c40 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
16c50 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
16c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16c80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16c90 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
16ca0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
16cb0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
16cc0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
16cd0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
16ce0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
16cf0 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70   If the eOp.** p
16d00 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
16d10 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
16d20 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f  eration (data co
16d30 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66  pied into.** buf
16d40 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74  fer pBuf). If it
16d50 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
16d60 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69  write (data copi
16d70 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65  ed from.** buffe
16d80 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41  r pBuf)..**.** A
16d90 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
16da0 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f  bytes are read o
16db0 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e  r written beginn
16dc0 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ing at "offset".
16dd0 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64  .** Data is read
16de0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
16df0 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
16e00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16e10 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
16e20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77  distinction betw
16e30 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61  een key and data
16e40 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61  ..** It just rea
16e50 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74  ds or writes byt
16e60 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c  es from the payl
16e70 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20  oad area.  Data 
16e80 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72  might .** appear
16e90 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
16ea0 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  e or be scattere
16eb0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
16ec0 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70  e overflow .** p
16ed0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ages..**.** If t
16ee0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e  he BtCursor.isIn
16ef0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
16f00 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  g is set, and th
16f10 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72  e current.** cur
16f20 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
16f30 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
16f40 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20  low pages, this 
16f50 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
16f60 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20  cates space for 
16f70 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75  and lazily poplu
16f80 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
16f90 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20  w page-list .** 
16fa0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
16fb0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
16fc0 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  . Subsequent cal
16fd0 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63  ls use this.** c
16fe0 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
16ff0 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
17000 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65  lied offset more
17010 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
17020 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
17030 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17040 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
17050 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
17060 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
17070 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
17080 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
17090 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
170a0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
170b0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
170c0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
170d0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
170e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
170f0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
17100 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
17110 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
17120 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17130 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
17140 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
17150 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
17160 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
17170 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
17180 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
17190 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
171a0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
171b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
171c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
171d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
171e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
171f0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
17200 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
17210 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
17220 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c  */.  int offset,
17230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
17240 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
17250 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
17260 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
17270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17280 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
17290 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
172a0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
172b0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
172c0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
172d0 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b   */ .  int skipK
172e0 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  ey,         /* o
172f0 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20  ffset begins at 
17300 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
17310 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  true */.  int eO
17320 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
17330 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
17340 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
17350 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
17360 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
17370 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
17380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
17390 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
173a0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
173b0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
173c0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74 72  Page;     /* Btr
173d0 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
173e0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
173f0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
17400 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
17410 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
17420 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
17430 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
17440 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
17450 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
17460 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
17470 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
17480 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
17490 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
174a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
174b0 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
174c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
174d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
174e0 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
174f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
17500 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
17510 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
17520 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
17530 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
17540 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72  ntKey ? 0 : pCur
17550 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
17560 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
17570 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
17580 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
17590 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
175a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
175b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
175c0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
175d0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
175e0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
175f0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
17600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17610 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  OR;.  }..  /* Ch
17620 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
17630 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
17640 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
17650 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
17660 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
17670 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17680 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
17690 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
176a0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
176b0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
176c0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
176d0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
176e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
176f0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
17700 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
17710 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
17720 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
17730 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
17740 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
17750 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
17760 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
17770 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
17780 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42 74  ocal;.  }..  pBt
17790 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
177a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
177b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
177c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c    const int ovfl
177d0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
177e0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
177f0 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
17800 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
17810 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
17820 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
17830 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
17840 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
17850 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
17860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
17870 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
17880 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
17890 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
178a0 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
178b0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
178c0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
178d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
178e0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
178f0 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
17900 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
17910 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
17920 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
17930 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
17940 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
17950 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
17960 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
17970 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
17980 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
17990 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
179a0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
179b0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
179c0 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
179d0 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
179e0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
179f0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
17a00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17a10 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
17a20 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
17a30 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
17a40 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
17a50 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
17a60 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
17a70 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
17a80 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
17a90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
17aa0 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
17ab0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
17ac0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
17ad0 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
17ae0 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
17af0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17b00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17b10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
17b20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17b30 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17b40 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
17b50 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
17b60 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
17b70 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
17b80 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
17b90 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
17ba0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
17bb0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
17bc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17bd0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
17be0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
17bf0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
17c00 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
17c10 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
17c20 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
17c30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
17c40 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
17c50 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
17c60 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
17c70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17c80 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
17c90 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
17ca0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
17cb0 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
17cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
17cd0 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
17ce0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
17cf0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
17d00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
17d10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
17d20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
17d30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17d40 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
17d50 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
17d60 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
17d70 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
17d80 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
17d90 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
17da0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
17db0 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
17dc0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
17dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17de0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
17df0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
17e00 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
17e10 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
17e20 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
17e30 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
17e40 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
17e50 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
17e60 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
17e70 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
17e80 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
17e90 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
17ea0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
17eb0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
17ec0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
17ed0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
17ee0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
17ef0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
17f00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
17f10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17f20 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
17f30 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17f40 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
17f50 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
17f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
17f70 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
17f80 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
17f90 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
17fa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
17fb0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
17fc0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
17fd0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
17fe0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
17ff0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
18000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18010 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
18020 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
18030 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
18040 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
18050 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
18060 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
18070 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
18080 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
18090 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
180a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
180b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
180c0 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
180d0 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
180e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
180f0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
18100 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
18110 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
18120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18130 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
18140 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
18150 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
18160 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
18170 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
18180 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
18190 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
181a0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
181b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
181c0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
181d0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
181e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
181f0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
18200 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
18210 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
18220 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
18230 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18240 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
18250 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
18260 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
18270 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
18280 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
18290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
182a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
182b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
182c0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
182d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
182e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
182f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18300 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
18310 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
18320 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
18330 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
18340 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
18350 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
18360 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
18370 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
18380 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
18390 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
183a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
183b0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
183c0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
183d0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
183e0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
183f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
18400 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
18410 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
18420 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
18430 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
18440 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
18450 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
18460 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
18470 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
18480 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
18490 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
184a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
184b0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
184c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
184d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
184e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
184f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18500 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18510 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18520 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18530 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  0 );.    if( pCu
18540 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
18550 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18560 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18570 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
18580 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18590 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  age->intKey==0 )
185a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
185b0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
185c0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
185d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
185e0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
185f0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
18600 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
18610 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
18620 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
18630 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18640 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
18650 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
18660 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18670 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18680 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18690 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
186a0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
186b0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
186c0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
186d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
186e0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
186f0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18700 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
18710 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
18720 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
18730 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
18740 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
18750 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
18760 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18770 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18780 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18790 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
187a0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
187b0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
187c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
187d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
187e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
187f0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
18800 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
18810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18820 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
18830 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
18840 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
18860 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
18870 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18880 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18890 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
188a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
188b0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
188c0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
188d0 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29  amt, pBuf, 1, 0)
188e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
188f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18900 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
18910 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
18920 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
18930 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
18940 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
18950 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
18960 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
18970 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
18980 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
18990 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
189a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
189b0 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
189c0 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
189d0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
189e0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
189f0 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
18a00 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
18a10 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
18a20 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
18a30 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
18a40 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
18a50 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
18a60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18a70 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18a80 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
18a90 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
18aa0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
18ab0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
18ac0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
18ad0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
18ae0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
18af0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
18b00 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
18b10 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
18b20 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
18b30 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
18b40 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
18b50 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
18b60 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
18b70 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
18b80 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
18b90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
18ba0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
18bb0 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68  reassembly.** th
18bc0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
18bd0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
18be0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
18bf0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
18c00 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
18c10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
18c20 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
18c30 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
18c40 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
18c50 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
18c60 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
18c70 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
18c80 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
18c90 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18ca0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
18cb0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18cc0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
18cd0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18ce0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
18cf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
18d00 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
18d10 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
18d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
18d30 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18d40 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
18d50 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
18d60 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
18d70 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
18d80 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
18d90 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
18da0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18db0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
18dc0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
18dd0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  32 nKey;.  int n
18de0 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
18df0 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
18e00 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
18e10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18e20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18e30 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
18e40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
18e50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
18e60 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
18e70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18e80 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18e90 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
18ea0 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ll );.  getCellI
18eb0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
18ec0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
18ed0 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
18ee0 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
18ef0 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
18f00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
18f10 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
18f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
18f30 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
18f40 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
18f50 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
18f60 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
18f70 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18f80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
18f90 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
18fa0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18fb0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
18fc0 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
18fd0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
18fe0 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
18ff0 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
19000 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
19010 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
19020 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
19030 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
19040 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
19050 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
19060 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
19070 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
19080 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
19090 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
190a0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
190b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
190c0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
190d0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
190e0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
190f0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
19100 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
19110 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
19120 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
19130 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
19140 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
19150 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
19160 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
19170 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
19180 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
19190 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
191a0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
191b0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
191c0 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
191d0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
191e0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
191f0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
19200 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
19210 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
19220 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
19230 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
19240 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
19250 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
19260 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
19270 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
19280 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
19290 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
192a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
192b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
192c0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
192d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
192e0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
192f0 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
19300 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
19310 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
19320 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63  .  return 0;.}.c
19330 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
19340 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
19350 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19360 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61   int *pAmt){.  a
19370 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19380 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19390 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
193a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
193b0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
193c0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
193d0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
193e0 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
193f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
19400 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19410 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
19420 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
19430 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
19440 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
19450 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
19460 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
19470 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ove to..*/.stati
19480 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
19490 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
194a0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
194b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
194c0 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
194d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61   MemPage *pOldPa
194e0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
194f0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
19500 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
19510 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19520 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
19530 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19540 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19550 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
19560 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
19570 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75  , &pNewPage, pCu
19580 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28  r->pPage);.  if(
19590 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
195a0 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78  .  pNewPage->idx
195b0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69  Parent = pCur->i
195c0 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d  dx;.  pOldPage =
195d0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
195e0 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69  pOldPage->idxShi
195f0 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  ft = 0;.  releas
19600 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b  ePage(pOldPage);
19610 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
19620 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
19630 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
19640 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
19650 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
19660 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
19670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19680 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19690 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
196a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
196b0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
196c0 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76  he page is the v
196d0 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69  irtual root of i
196e0 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ts table..**.** 
196f0 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  The virtual root
19700 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f   page is the roo
19710 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20  t page for most 
19720 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20  tables.  But.** 
19730 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f  for the table ro
19740 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20  oted on page 1, 
19750 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61  sometime the rea
19760 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  l root page.** i
19770 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66  s empty except f
19780 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
19790 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63  nter.  In such c
197a0 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74  ases the.** virt
197b0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
197c0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
197d0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
197e0 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73   of page.** 1 is
197f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
19800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19810 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50  eIsRootPage(MemP
19820 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
19830 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
19840 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
19850 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19860 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
19870 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ) );.  pParent =
19880 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
19890 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d  .  if( pParent==
198a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
198b0 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  if( pParent->pgn
198c0 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o>1 ) return 0;.
198d0 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28 26    if( get2byte(&
198e0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
198f0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
19900 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  t+3])==0 ) retur
19910 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
19920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
19930 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
19940 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
19950 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
19960 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
19970 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
19980 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
19990 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
199a0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
199b0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
199c0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
199d0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
199e0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
199f0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
19a00 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
19a10 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
19a20 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
19a30 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
19a40 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74  eMoveToParent(Bt
19a50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19a60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19a70 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
19a80 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61  age;.  int idxPa
19a90 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
19aa0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19ab0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
19ac0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19ad0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19ae0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
19af0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
19b00 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
19b10 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
19b20 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
19b30 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50  e(pPage) );.  pP
19b40 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
19b50 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
19b60 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  ( pParent!=0 );.
19b70 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50    idxParent = pP
19b80 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
19b90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
19ba0 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
19bb0 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
19bc0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
19bd0 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65  r->pPage = pPare
19be0 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  nt;.  pCur->info
19bf0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73  .nSize = 0;.  as
19c00 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
19c10 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
19c20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
19c30 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
19c40 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
19c50 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
19c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19c70 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
19c80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19c90 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
19ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19cb0 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
19cc0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
19cd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19ce0 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
19cf0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19d00 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
19d10 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
19d20 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
19d30 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
19d40 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
19d50 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
19d60 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
19d70 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
19d80 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
19d90 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
19da0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19db0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
19dc0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
19dd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19de0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
19df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
19e00 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
19e10 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
19e20 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19e30 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
19e40 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
19e50 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
19e60 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
19e70 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
19e80 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
19e90 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
19ea0 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
19eb0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
19ec0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
19ed0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
19ee0 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
19ef0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
19f00 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19f10 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
19f20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19f30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19f40 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
19f50 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
19f60 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
19f70 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
19f80 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
19f90 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   0;.  if( pRoot-
19fa0 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
19fb0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
19fc0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
19fd0 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
19fe0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
19ff0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
1a000 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
1a010 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
1a020 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
1a030 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
1a040 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1a050 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
1a060 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1a070 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
1a080 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75  page);.  }.  pCu
1a090 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43  r->eState = ((pC
1a0a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a0b0 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
1a0c0 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
1a0d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a0e0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a0f0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a100 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1a110 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1a120 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1a130 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a140 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1a160 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1a170 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1a180 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1a190 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1a1a0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1a1b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a1c0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1a1d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a1e0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a1f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a200 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a210 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a220 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a230 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a240 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a250 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a260 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a270 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1a280 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
1a290 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
1a2a0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1a2b0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
1a2c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1a2d0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1a2e0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1a2f0 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20  , pCur->idx));. 
1a300 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1a310 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1a320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1a340 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1a350 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1a360 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1a370 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
1a380 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1a390 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1a3a0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
1a3b0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
1a3c0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
1a3d0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
1a3e0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
1a3f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
1a400 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
1a410 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1a420 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
1a430 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
1a440 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
1a450 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
1a460 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1a470 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
1a480 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
1a490 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
1a4a0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
1a4b0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
1a4c0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
1a4d0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1a4e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a4f0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
1a500 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1a510 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1a520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a530 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a540 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a550 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a560 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a570 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a580 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a590 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a5a0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1a5b0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
1a5c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1a5d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1a5e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1a5f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1a600 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1a610 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
1a620 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1a630 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1a640 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1a650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a660 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1a670 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20  e->nCell - 1;.  
1a680 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a690 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ze = 0;.  }.  re
1a6a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a6b0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1a6c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1a6d0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1a6e0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1a6f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1a700 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1a710 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1a720 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1a730 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1a740 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1a750 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1a760 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1a770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a780 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1a790 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1a7a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
1a7b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a7c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a7d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1a7e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a7f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1a800 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1a810 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1a820 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1a830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a840 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a850 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1a860 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1a870 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1a880 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1a890 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1a8a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1a8b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a8c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a8d0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1a8e0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1a8f0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1a900 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1a910 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1a920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a930 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a940 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1a950 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1a960 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1a970 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1a980 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1a990 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1a9a0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1a9b0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1a9c0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1a9d0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1a9e0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1a9f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1aa00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1aa10 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1aa20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1aa30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1aa40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1aa50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1aa60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1aa70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1aa80 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1aa90 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1aaa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
1aac0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1aad0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1aae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1aaf0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1ab00 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1ab10 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1ab20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ab30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ab40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1ab50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1ab60 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1ab70 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1ab80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ab90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1aba0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
1abb0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1abc0 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
1abd0 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52   pKey/nKey..** R
1abe0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
1abf0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
1ac00 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f  INTKEY tables, o
1ac10 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72  nly the nKey par
1ac20 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1ac30 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
1ac40 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20  red.  For other 
1ac50 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20  tables, nKey is 
1ac60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ac70 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69  tes of data.** i
1ac80 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  n pKey..**.** If
1ac90 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
1aca0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
1acb0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1acc0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
1acd0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
1ace0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
1acf0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
1ad00 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
1ad10 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
1ad20 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
1ad30 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
1ad40 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
1ad50 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
1ad60 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  key..**.** The r
1ad70 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1ad80 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1ad90 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1ada0 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ch the.** cursor
1adb0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
1adc0 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55  pRes if pRes!=NU
1add0 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  LL.  The meaning
1ade0 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75   of.** this valu
1adf0 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
1ae00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1ae10 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1ae20 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1ae30 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1ae40 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1ae50 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1ae60 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72  ler than pKey or
1ae70 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1ae80 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1ae90 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1aea0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1aeb0 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1aec0 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1aed0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1aee0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1aef0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1af00 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1af10 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1af20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1af30 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a  tches pKey..**.*
1af40 2a 20 20 20 20 20 2a 70 52 65 73 3e 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 6c 61 72 67 65 72 20 74 68      is larger th
1afa0 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  an pKey..**.*/.i
1afb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
1afc0 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
1afd0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1afe0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1aff0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63   be moved */.  c
1b000 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1b010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
1b020 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64   content for ind
1b030 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20  ices.  Not used 
1b040 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  by tables */.  i
1b050 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
1b060 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b070 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b   pKey.  Or the k
1b080 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f  ey for tables */
1b090 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
1b0a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
1b0b0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1b0c0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1b0d0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1b0e0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1b0f0 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75    /* Search resu
1b100 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20  lt flag */.){.  
1b110 69 6e 74 20 72 63 3b 0a 20 20 56 64 62 65 50 61  int rc;.  VdbePa
1b120 72 73 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  rsedRecord *pPKe
1b130 79 3b 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  y;.  char aSpace
1b140 5b 32 30 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [200];..  assert
1b150 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b160 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1b170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b180 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1b190 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1b1a0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1b1b0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1b1c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1b1d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1b1e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1b1f0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1b200 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49  pCur->pPage->isI
1b210 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nit );.  if( pCu
1b220 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b230 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1b240 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1b250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b260 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
1b270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b280 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1b290 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
1b2a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 50 4b  ntKey ){.    pPK
1b2b0 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
1b2c0 0a 20 20 20 20 70 50 4b 65 79 20 3d 20 73 71 6c  .    pPKey = sql
1b2d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 50 61  ite3VdbeRecordPa
1b2e0 72 73 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  rse(pCur->pKeyIn
1b2f0 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  fo, nKey, pKey,.
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
1b330 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
1b340 69 66 28 20 70 50 4b 65 79 3d 3d 30 20 29 20 72  if( pPKey==0 ) r
1b350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1b360 45 4d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b  EM;.  }.  for(;;
1b370 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
1b380 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
1b390 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
1b3a0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1b3b0 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20  >pPage;.    int 
1b3c0 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
1b3d0 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
1b3e0 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
1b3f0 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
1b400 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
1b410 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1b420 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
1b430 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30  ntKey && pKey==0
1b440 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b450 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b460 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
1b470 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1b480 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73    }.    if( bias
1b490 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
1b4a0 43 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a  Cur->idx = upr;.
1b4b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4c0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70   pCur->idx = (up
1b4d0 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+lwr)/2;.    }.
1b4e0 20 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72      if( lwr<=upr
1b4f0 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20   ) for(;;){.    
1b500 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
1b510 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c  ;.      i64 nCel
1b520 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72  lKey;.      pCur
1b530 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1b540 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1b550 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1b560 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
1b570 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
1b580 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b590 70 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61  pCur->idx) + pPa
1b5a0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
1b5b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1b5c0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
1b5d0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
1b5e0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
1b5f0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
1b600 74 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d  t32(pCell, &dumm
1b610 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1b620 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1b630 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e  pCell, (u64 *)&n
1b640 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1b650 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e    if( nCellKey<n
1b660 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1b670 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
1b680 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
1b690 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key>nKey ){.    
1b6a0 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1b6b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b6c0 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1b6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1b6e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1b6f0 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1b700 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1b710 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1b720 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1b730 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1b740 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1b750 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1b760 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1b770 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1b780 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1b790 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b7a0 43 6f 6d 70 61 72 65 50 61 72 73 65 64 28 6e 43  CompareParsed(nC
1b7b0 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b7c0 2c 20 70 50 4b 65 79 29 3b 0a 20 20 20 20 20 20  , pPKey);.      
1b7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b7e0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
1b7f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43  lite3_malloc( nC
1b800 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ellKey );.      
1b810 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
1b820 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b830 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1b840 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b850 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1b860 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
1b870 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
1b880 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1b890 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1b8a0 6f 6d 70 61 72 65 50 61 72 73 65 64 28 6e 43 65  ompareParsed(nCe
1b8b0 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1b8c0 20 70 50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20   pPKey);.       
1b8d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b8e0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1b8f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1b900 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1b910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
1b930 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1b940 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1b950 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  a && !pPage->lea
1b960 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
1b970 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  wr = pCur->idx;.
1b980 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
1b990 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
1b9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b9c0 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1b9d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
1b9e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b9f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1ba00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1ba10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
1ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
1ba40 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
1ba50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ba60 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
1ba70 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
1ba80 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
1ba90 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1baa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1bab0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
1bac0 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+upr)/2;.    }.
1bad0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
1bae0 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
1baf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1bb00 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
1bb10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bb20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
1bb30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
1bb40 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
1bb50 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1bb60 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1bb70 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1bb80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1bb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bba0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1bbb0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1bbc0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
1bbd0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
1bbe0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1bbf0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
1bc00 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
1bc10 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
1bc20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
1bc30 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
1bc40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bc50 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
1bc60 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1bc70 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1bc80 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  x = lwr;.    pCu
1bc90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1bca0 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
1bcb0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
1bcc0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
1bcd0 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
1bce0 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65  finish;.  }.move
1bcf0 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 73 71 6c  to_finish:.  sql
1bd00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1bd10 70 61 72 73 65 28 70 50 4b 65 79 29 3b 0a 20 20  parse(pPKey);.  
1bd20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1bd30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1bd40 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1bd50 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
1bd60 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
1bd70 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
1bd80 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
1bd90 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
1bda0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
1bdb0 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
1bdc0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
1bdd0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1bde0 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
1bdf0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
1be00 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
1be10 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
1be20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
1be30 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1be40 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1be50 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
1be60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
1be70 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
1be80 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1be90 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1bea0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
1beb0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
1bec0 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
1bed0 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
1bee0 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1bef0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
1bf00 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
1bf10 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
1bf20 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
1bf30 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
1bf40 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
1bf50 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
1bf60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1bf70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1bf80 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
1bf90 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c  a cursor..*/.sql
1bfa0 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72  ite3 *sqlite3Btr
1bfb0 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74  eeCursorDb(const
1bfc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29   BtCursor *pCur)
1bfd0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1bfe0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1bff0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1c000 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1c010 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1c020 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->db;.}../*.** A
1c030 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1c040 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1c050 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c060 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1c070 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1c080 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1c090 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1c0a0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1c0b0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c0c0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c0d0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c0e0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c0f0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c100 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  Res=1..*/.static
1c110 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
1c120 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c130 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c140 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1c150 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c160 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c170 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c180 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c190 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c1a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c1d0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1c1e0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1c1f0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1c200 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1c210 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1c220 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1c230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c240 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1c250 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1c260 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1c270 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1c280 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1c290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c2a0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1c2b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1c2c0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1c2d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c2e0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1c2f0 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1c300 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1c310 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1c320 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1c330 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
1c340 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1c350 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
1c360 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
1c370 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c380 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c390 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
1c3a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c3b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
1c3c0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1c3d0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1c3e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1c3f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c400 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
1c410 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1c420 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1c430 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
1c440 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1c450 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c460 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1c470 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c480 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1c490 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c4a0 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
1c4b0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
1c4c0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c4d0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
1c4e0 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
1c4f0 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
1c500 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1c510 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b  age->leafData ){
1c520 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c530 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
1c540 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1c550 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1c560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c570 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c580 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1c590 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
1c5a0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
1c5b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c5c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c5d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1c5e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
1c5f0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1c600 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c610 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1c620 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1c630 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c640 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1c650 3d 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  = btreeNext(pCur
1c660 2c 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72  , pRes);.  retur
1c670 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c680 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1c690 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1c6a0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1c6b0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c6c0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1c6d0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1c6e0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1c6f0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1c700 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1c710 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c730 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1c740 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c750 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1c760 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  es=1..*/.static 
1c770 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
1c780 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1c790 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1c7a0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1c7b0 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1c7c0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c7d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c7e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c7f0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c800 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c810 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c840 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1c850 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1c860 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1c870 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1c880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c890 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1c8a0 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
1c8b0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1c8c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1c8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c8e0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1c8f0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
1c900 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
1c910 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1c920 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1c930 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29  ( pCur->idx>=0 )
1c940 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1c950 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1c960 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e   = get4byte( fin
1c970 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1c980 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72  r->idx) );.    r
1c990 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1c9a0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
1c9b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1c9c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c9d0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
1c9e0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1c9f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
1ca00 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d  hile( pCur->idx=
1ca10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1ca20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1ca30 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1ca40 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1ca50 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1ca60 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1ca70 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1ca80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ca90 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1caa0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
1cab0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1cac0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1cad0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1cae0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1caf0 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
1cb00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1cb10 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1cb20 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1cb30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1cb40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1cb50 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1cb60 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1cb70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cb80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cb90 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1cba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1cbb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
1cbc0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1cbd0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1cbe0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1cbf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1cc00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1cc10 0a 20 20 72 63 20 3d 20 62 74 72 65 65 50 72 65  .  rc = btreePre
1cc20 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1cc30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cc40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1cc50 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1cc60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1cc70 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1cc80 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1cc90 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1cca0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1ccb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ccc0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1ccd0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1cce0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1ccf0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1cd00 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1cd10 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1cd20 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1cd30 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1cd40 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1cd50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cd60 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1cd70 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1cd80 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1cd90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1cda0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1cdb0 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1cdc0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1cdd0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1cde0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1cdf0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1ce00 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1ce10 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1ce20 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1ce30 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1ce40 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1ce50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1ce60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1ce70 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1ce80 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1ce90 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1cea0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1ceb0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1cec0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1ced0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1cee0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1cef0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1cf00 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1cf10 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1cf20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1cf30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cf40 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1cf50 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1cf60 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1cf70 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1cf80 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1cf90 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1cfa0 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1cfb0 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1cfc0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1cfd0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1cfe0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1cff0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1d000 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1d010 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1d020 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d030 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1d040 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1d050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d060 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d070 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1d080 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1d090 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1d0a0 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1d0b0 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1d0c0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1d0d0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1d0e0 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1d0f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d100 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1d110 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1d120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d130 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1d140 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1d150 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1d160 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1d170 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1d180 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1d190 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d1a0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d1b0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1d1c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1d1d0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1d1e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d1f0 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1d200 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1d210 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1d220 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1d230 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1d240 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1d250 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1d260 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1d270 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1d280 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1d290 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1d2a0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1d2b0 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1d2c0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1d2d0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1d2e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1d2f0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1d300 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1d310 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1d320 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1d330 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1d340 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1d350 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1d360 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1d370 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1d380 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d390 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1d3a0 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c  t && nearby<=sql
1d3b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1d3c0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1d3d0 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1d3e0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1d3f0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1d400 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1d410 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1d420 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d430 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1d440 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1d450 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d460 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1d470 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d480 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d490 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1d4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d4b0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1d4c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1d4d0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1d4e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1d4f0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1d500 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1d510 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1d520 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1d530 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1d540 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1d550 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1d560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d570 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1d580 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1d590 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d5a0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1d5b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d5c0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1d5d0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1d5e0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1d5f0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1d600 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1d610 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1d620 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1d630 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1d640 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1d650 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1d660 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1d670 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1d680 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1d690 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1d6a0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1d6b0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1d6c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1d6d0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1d6e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1d6f0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1d700 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1d710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d720 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1d730 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d740 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1d750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d760 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1d770 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1d780 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1d790 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d7a0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1d7b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d7c0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d7d0 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1d7e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1d7f0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1d800 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1d810 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1d820 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1d830 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1d840 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1d850 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1d860 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1d870 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1d880 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1d890 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1d8a0 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1d8b0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1d8c0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1d8d0 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1d8e0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1d8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d900 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1d910 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1d920 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d930 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1d940 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1d950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1d960 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1d970 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1d980 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1d990 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1d9a0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1d9b0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1d9c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1d9d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1d9e0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1d9f0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1da00 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1da10 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1da20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1da30 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1da40 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1da50 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1da60 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1da70 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1da80 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1da90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1daa0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1dab0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1dac0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1dad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dae0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1daf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1db00 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1db10 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1db20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1db30 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1db40 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1db50 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1db60 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1db70 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1db80 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1db90 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1dba0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1dbb0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1dbc0 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1dbd0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1dbe0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1dbf0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1dc00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dc10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dc20 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1dc30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1dc40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1dc50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1dc60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1dc70 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1dc80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1dc90 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1dcb0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1dcc0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1dcd0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1dce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dcf0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1dd00 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1dd10 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1dd20 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1dd30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dd40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dd50 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1dd60 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1dd70 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1dd80 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1dd90 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1dda0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1ddb0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1ddc0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1ddd0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1dde0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1ddf0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1de00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1de10 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1de20 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1de30 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1de40 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1de50 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1de60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1de70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1de80 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1de90 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1deb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ded0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1dee0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1def0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1df00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1df10 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1df20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1df30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1df40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1df50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1df60 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1df70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1df80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1df90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dfa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1dfb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1dfc0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1dfd0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1dfe0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1dff0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1e000 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1e010 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1e020 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1e030 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1e040 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1e050 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e060 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1e070 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1e080 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e090 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1e0a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e0b0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1e0c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e0e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e0f0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1e100 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e110 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1e130 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e140 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e150 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e160 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1e170 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e180 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1e190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e1a0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1e1b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1e1c0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1e1d0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1e1e0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1e1f0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1e200 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1e210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1e220 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1e230 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1e240 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1e250 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1e260 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1e270 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e280 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1e290 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1e2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e2b0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e2c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e2d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e2e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e2f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e310 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1e320 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1e330 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1e340 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1e350 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1e360 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1e370 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1e380 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1e390 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1e3a0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1e3b0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1e3d0 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1e3e0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1e3f0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1e400 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1e410 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1e420 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1e430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e440 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1e450 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1e460 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1e470 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1e480 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e490 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1e4a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1e4b0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1e4c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1e4d0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1e4e0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1e4f0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1e500 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1e510 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1e520 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1e530 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74  if( *pPgno>sqlit
1e540 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1e550 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1e560 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1e570 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1e580 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1e590 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1e5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e5b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e5d0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e5e0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1e5f0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1e600 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1e610 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1e620 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1e630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e640 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1e650 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1e660 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1e670 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1e680 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1e690 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1e6a0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1e6b0 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1e6c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e6d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1e6e0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1e6f0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1e700 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e710 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1e720 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1e730 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e750 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e760 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e770 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1e780 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e790 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e7a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1e7b0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1e7c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e7d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e7f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1e800 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1e810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e820 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1e830 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1e840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e850 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e860 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1e870 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1e880 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1e890 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1e8a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e8b0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1e8c0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1e8d0 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1e8e0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1e8f0 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1e900 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
1e910 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
1e920 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e930 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66  Pager) + 1;..#if
1e940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e950 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e960 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1e970 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1e980 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1e990 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1e9a0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1e9b0 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1e9c0 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1e9d0 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1e9e0 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1e9f0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1ea00 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1ea10 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1ea20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1ea30 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1ea40 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1ea50 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1ea60 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1ea70 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1ea80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1ea90 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1eaa0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1eab0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1eac0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1ead0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1eae0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1eaf0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1eb00 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1eb10 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1eb20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1eb30 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1eb40 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1eb50 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1eb60 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1eb70 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1eb80 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1eb90 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1eba0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1ebb0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1ebc0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1ebd0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1ebe0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1ebf0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1ec00 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1ec10 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1ec20 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1ec30 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1ec40 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
1ec50 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ec60 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
1ec70 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  no)++; }.    }. 
1ec80 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1ec90 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
1eca0 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
1ecb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ecc0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1ecd0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1ece0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1ecf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ed00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1ed10 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1ed20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1ed30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ed40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ed50 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1ed60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1ed70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ed80 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1ed90 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1eda0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1edb0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1edc0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1edd0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1ede0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1edf0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1ee00 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1ee10 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1ee20 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1ee30 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1ee40 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1ee50 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1ee60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1ee70 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1ee80 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1ee90 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1eea0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1eeb0 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1eec0 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1eed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1eee0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1eef0 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1ef00 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1ef10 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1ef20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1ef30 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1ef40 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1ef50 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1ef60 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1ef70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ef80 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1ef90 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1efa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1efb0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1efc0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1efd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1efe0 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
1eff0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
1f000 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
1f010 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
1f020 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
1f030 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
1f040 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f050 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1f060 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1f070 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
1f080 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f090 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
1f0a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f0b0 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
1f0c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1f0d0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
1f0e0 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1f0f0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
1f100 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1f110 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
1f120 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
1f130 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
1f140 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
1f150 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
1f160 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1f170 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1f180 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1f190 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f1a0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
1f1b0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
1f1c0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
1f1d0 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ze);.#endif..#if
1f1e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f1f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1f200 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f210 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
1f220 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
1f230 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
1f240 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
1f250 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1f260 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
1f270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1f280 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f290 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1f2a0 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67  t(pBt, pPage->pg
1f2b0 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  no, PTRMAP_FREEP
1f2c0 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
1f2d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f2e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1f2f0 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( n==0 ){.    /
1f300 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69  * This is the fi
1f310 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f  rst free page */
1f320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f330 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1f340 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1f350 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f360 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   rc;.    memset(
1f370 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1f380 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74   8);.    put4byt
1f390 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f3a0 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1f3b0 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22  o);.    TRACE(("
1f3c0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69  FREE-PAGE: %d fi
1f3d0 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70  rst\n", pPage->p
1f3e0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
1f3f0 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65      /* Other fre
1f400 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  e pages already 
1f410 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20  exist.  Retrive 
1f420 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
1f430 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  page.    ** of t
1f440 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
1f450 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e  find out how man
1f460 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e  y leaves it has.
1f470 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
1f480 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20  *pTrunk;.    rc 
1f490 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1f4a0 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
1f4b0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1f4c0 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b  ta[32]), &pTrunk
1f4d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1f4e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f4f0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1f500 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1f510 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42  );.    if( k>=pB
1f520 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
1f530 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
1f540 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c  The trunk is ful
1f550 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67  l.  Turn the pag
1f560 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e  e being freed in
1f570 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a  to a new.      *
1f580 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74  * trunk page wit
1f590 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a  h no leaves. */.
1f5a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f5b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1f5c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1f5d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f5e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f5f0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1f600 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e  >aData, pTrunk->
1f610 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  pgno);.        p
1f620 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1f630 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
1f640 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f650 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f660 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1f670 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1f680 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
1f690 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
1f6a0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20  placing %d\n",. 
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f6c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75  Page->pgno, pTru
1f6d0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1f6e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1f6f0 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  ( k<0 ){.      r
1f700 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f710 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
1f720 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1f730 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65  newly freed page
1f740 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68   as a leaf on th
1f750 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20  e current trunk 
1f760 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1f770 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f780 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1f790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f7b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f7c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1f7d0 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70   k+1);.        p
1f7e0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1f7f0 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70  >aData[8+k*4], p
1f800 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
1f810 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
1f820 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
1f830 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
1f840 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
1f850 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  DbPage);.#endif.
1f860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
1f870 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1f880 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
1f890 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
1f8a0 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
1f8b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
1f8c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f8d0 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Trunk);.  }.  re
1f8e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f8f0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
1f900 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
1f910 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
1f920 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
1f930 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
1f940 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
1f950 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1f960 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
1f970 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1f980 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
1f990 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
1f9a0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
1f9b0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
1f9c0 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69    int ovflPageSi
1f9d0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
1f9e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f9f0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1fa00 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
1fa10 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1fa20 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1fa30 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
1fa40 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
1fa50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1fa60 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
1fa70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1fa80 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
1fa90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
1faa0 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
1fab0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
1fac0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1fad0 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  w]);.  ovflPageS
1fae0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1faf0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
1fb00 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
1fb10 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
1fb20 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
1fb30 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
1fb40 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
1fb50 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
1fb60 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
1fb70 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
1fb80 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a  MemPage *pOvfl;.
1fb90 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
1fba0 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  ==0 || ovflPgno>
1fbb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1fbc0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1fbd0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
1fbe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1fbf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1fc00 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1fc10 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
1fc20 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
1fc30 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
1fc40 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
1fc50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fc60 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
1fc70 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
1fc80 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1fc90 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
1fca0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1fcb0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
1fcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fcd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1fce0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
1fcf0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
1fd00 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
1fd10 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
1fd20 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
1fd30 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
1fd40 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
1fd50 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
1fd60 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
1fd70 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
1fd80 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
1fd90 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
1fda0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1fdb0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
1fdc0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
1fdd0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1fde0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
1fdf0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1fe00 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
1fe10 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
1fe20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1fe30 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1fe40 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
1fe50 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
1fe60 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
1fe70 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
1fe80 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
1fe90 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
1fea0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
1feb0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
1fec0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
1fed0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1fee0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
1fef0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff10 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1ff20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
1ff30 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
1ff40 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
1ff50 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
1ff60 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
1ff70 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
1ff80 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
1ff90 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
1ffa0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
1ffb0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
1ffc0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
1ffd0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
1ffe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fff0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
20000 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
20010 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
20020 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
20050 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
20060 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
20070 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
20080 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
20090 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
200a0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
200b0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
200c0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
200d0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
200e0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
200f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20100 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
20110 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
20120 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
20130 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
20140 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
20150 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
20160 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20170 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
20180 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
20190 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
201a0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
201b0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
201c0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
201d0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
201e0 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
201f0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
20200 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
20210 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
20220 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
20230 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
20240 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
20250 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
20260 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
20270 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
20280 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
20290 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
202a0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
202b0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
202c0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
202d0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
202e0 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
202f0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
20300 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
20310 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
20320 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f  +nZero );.  .  /
20330 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
20340 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
20350 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
20360 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
20370 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20380 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
20390 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
203a0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
203b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
203c0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
203d0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
203e0 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
203f0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
20400 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
20410 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
20420 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
20430 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
20440 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
20450 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20460 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
20470 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
20480 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
20490 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
204a0 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23  t isExact = 0;.#
204b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
204c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
204d0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
204e0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
204f0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
20500 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
20510 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
20520 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20530 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
20540 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
20550 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
20560 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
20570 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
20580 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
20590 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
205a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
205b0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
205c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
205d0 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20  gnoOvfl>1 ){.   
205e0 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63         /* isExac
205f0 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20  t = 1; */.      
20600 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20610 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
20620 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
20630 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
20640 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
20650 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e  , isExact);.#ifn
20660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20670 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
20680 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
20690 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
206a0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
206b0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
206c0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
206d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
206e0 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
206f0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
20700 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
20710 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
20720 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
20730 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20740 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
20750 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
20760 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
20770 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
20780 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
20790 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
207a0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
207b0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
207c0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
207d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
207e0 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
207f0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
20800 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
20810 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
20820 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
20830 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
20840 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
20850 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
20860 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
20870 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
20880 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20890 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
208a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
208b0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
208c0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
208d0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
208e0 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
208f0 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
20900 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
20910 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
20920 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
20930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
20940 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
20950 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
20960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20970 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20980 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
20990 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
209a0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
209b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
209c0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
209d0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
209e0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
209f0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
20a00 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
20a10 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
20a20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
20a30 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
20a40 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
20a50 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
20a60 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
20a70 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
20a80 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
20a90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
20ab0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
20ac0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
20ad0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
20ae0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
20af0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
20b00 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
20b10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20b20 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
20b30 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
20b40 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
20b50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
20b60 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
20b70 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
20b80 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
20b90 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
20ba0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
20bb0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
20bc0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
20bd0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
20be0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
20bf0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
20c00 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
20c10 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
20c20 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
20c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20c40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
20c50 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  the MemPage.pPar
20c60 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74  ent pointer on t
20c70 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75  he page whose nu
20c80 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e  mber is.** given
20c90 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
20ca0 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  rgument so that 
20cb0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
20cc0 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69  holds the.** poi
20cd0 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72  nter in the thir
20ce0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
20cf0 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
20d00 6e 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  ntPage(BtShared 
20d10 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
20d20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
20d30 72 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a  rent, int idx){.
20d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73    MemPage *pThis
20d50 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
20d60 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
20d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20d80 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
20d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
20da0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
20db0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
20dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20dd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
20de0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62  ager!=0 );.  pDb
20df0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
20e00 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
20e10 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
20e20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
20e30 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50     pThis = (MemP
20e40 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
20e50 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
20e60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  ge);.    if( pTh
20e70 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  is->isInit ){.  
20e80 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69      assert( pThi
20e90 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  s->aData==sqlite
20ea0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
20eb0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
20ec0 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
20ed0 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29  nt!=pNewParent )
20ee0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
20ef0 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73  his->pParent ) s
20f00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20f10 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
20f20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20f30 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e     pThis->pParen
20f40 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a  t = pNewParent;.
20f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20f60 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65  agerRef(pNewPare
20f70 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
20f80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
20f90 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
20fa0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
20fb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20fc0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23  pDbPage);.  }..#
20fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20fe0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20ff0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
21000 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
21010 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
21020 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
21030 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
21040 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64  >pgno);.  }.#end
21050 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
21060 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
21070 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
21080 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
21090 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
210a0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
210b0 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
210c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
210d0 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
210e0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
210f0 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
21100 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
21110 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
21120 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
21130 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
21140 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
21150 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
21160 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
21170 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
21180 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
21190 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
211a0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
211b0 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ges(MemPage *pPa
211c0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ge){.  int i;.  
211d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
211e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
211f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21200 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
21210 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21220 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
21230 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
21240 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e  e->leaf ) return
21250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
21260 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
21270 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
21280 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
21290 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
212a0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  ;.    rc = repar
212b0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
212c0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
212d0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
212e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
212f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21300 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
21310 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
21320 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
21330 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21340 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20  +8]), .         
21350 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
21360 2c 20 69 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  , i);.  pPage->i
21370 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
21380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21390 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
213a0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
213b0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
213c0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
213d0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
213e0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
213f0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
21400 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
21410 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
21420 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
21430 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
21440 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
21450 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
21460 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
21470 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
21480 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
21490 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
214a0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
214b0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
214c0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
214d0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
214e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
214f0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
21500 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
21510 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21520 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
21530 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
21540 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
21550 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
21560 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
21570 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
21580 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
21590 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
215a0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
215b0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
215c0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
215d0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
215e0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
215f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
21600 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
21610 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
21620 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21630 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
21640 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
21650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21670 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
21680 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
21690 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
216a0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
216b0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
216c0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
216d0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
216e0 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
216f0 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
21700 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
21710 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
21720 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
21730 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
21740 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
21750 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
21760 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
21770 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
21780 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
21790 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
217a0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
217b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
217c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
217d0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
217e0 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 2;.  pPage->id
217f0 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  xShift = 1;.}../
21800 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
21810 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
21820 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
21830 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
21840 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
21850 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
21860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
21870 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
21880 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
21890 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
218a0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
218b0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
218c0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
218d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
218e0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
218f0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
21900 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
21910 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
21920 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
21930 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
21940 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
21950 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
21960 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
21970 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
21980 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
21990 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
219a0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
219b0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
219c0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
219d0 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
219e0 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
219f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
21a00 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
21a10 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
21a20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
21a30 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
21a40 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
21a50 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
21a60 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
21a70 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
21a80 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
21a90 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
21aa0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
21ab0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
21ac0 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
21ad0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
21ae0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
21af0 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
21b00 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
21b10 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
21b20 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
21b30 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
21b40 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
21b50 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
21b60 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
21b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21b80 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
21b90 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
21ba0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
21bb0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
21bc0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
21bd0 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
21be0 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
21bf0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
21c00 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
21c10 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
21c20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
21c30 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
21c40 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
21c50 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20  d */.  u8 nSkip 
21c60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
21c70 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72  ot write the fir
21c80 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
21c90 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  f the cell */.){
21ca0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
21cb0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
21cc0 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
21cd0 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
21ce0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
21cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21d00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
21d10 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
21d20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
21d30 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
21d40 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
21d50 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
21d60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
21d70 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
21d80 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
21d90 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
21da0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
21db0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
21dc0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
21dd0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
21de0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
21df0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
21e00 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
21e10 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
21e20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
21e30 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
21e40 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
21e50 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
21e60 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
21e70 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
21e80 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
21e90 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
21ea0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
21eb0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
21ec0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
21ed0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
21ee0 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
21ef0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
21f00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
21f10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
21f20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
21f30 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
21f40 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
21f50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21f60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
21f70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
21f80 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
21f90 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
21fa0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
21fb0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
21fc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
21fd0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
21fe0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
21ff0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
22000 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
22010 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
22020 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
22030 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
22040 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
22050 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
22060 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
22070 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
22080 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
22090 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
220a0 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
220b0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
220c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
220d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
220e0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
220f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
22100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22120 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22130 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
22140 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
22150 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
22160 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
22170 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
22180 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22190 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
221a0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
221b0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
221c0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
221d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
221e0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
221f0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
22200 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
22210 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
22220 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
22230 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
22240 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
22250 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
22260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22270 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22280 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32        top = get2
22290 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
222a0 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ]);.      assert
222b0 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f  ( end + sz <= to
222c0 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p );.    }.    i
222d0 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dx = allocateSpa
222e0 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20  ce(pPage, sz);. 
222f0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30     assert( idx>0
22300 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22310 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28  end <= get2byte(
22320 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
22330 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
22340 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
22350 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20  nFree -= 2;.    
22360 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
22370 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
22380 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
22390 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32  .    for(j=end-2
223a0 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
223b0 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
223c0 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
223d0 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
223e0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
223f0 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
22400 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
22410 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
22420 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
22430 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
22440 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
22450 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69  idxShift = 1;.#i
22460 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22470 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22480 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
22490 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
224a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
224b0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
224c0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
224d0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
224e0 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
224f0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
22500 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22510 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
22520 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
22530 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
22540 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  info;.      sqli
22550 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
22560 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
22570 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
22580 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
22590 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
225a0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
225b0 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
225c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
225d0 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
225e0 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
225f0 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
22600 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  al ){.        Pg
22610 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
22620 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
22630 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
22640 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
22650 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
22660 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
22670 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
22680 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
22690 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
226a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
226b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
226c0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
226d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
226e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
226f0 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
22700 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
22710 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
22720 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
22730 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
22740 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
22750 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
22760 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
22770 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
22780 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
22790 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
227a0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
227b0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
227c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
227d0 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
227e0 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
227f0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
22800 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22810 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
22820 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
22830 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
22840 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
22850 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
22860 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22870 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
22880 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
22890 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
228a0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
228b0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
228c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
228d0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
228e0 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
228f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
22900 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
22910 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
22920 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
22930 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
22940 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
22950 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
22960 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
22970 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
22980 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
22990 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
229a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
229b0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
229c0 74 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53  tex) );.  totalS
229d0 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ize = 0;.  for(i
229e0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
229f0 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65  ){.    totalSize
22a00 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
22a10 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61  }.  assert( tota
22a20 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70  lSize+2*nCell<=p
22a30 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20  Page->nFree );. 
22a40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22a50 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65  nCell==0 );.  ce
22a60 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63  llptr = pPage->c
22a70 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  ellOffset;.  dat
22a80 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
22a90 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
22aa0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75  >hdrOffset;.  pu
22ab0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22ac0 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69  +3], nCell);.  i
22ad0 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( nCell ){.    
22ae0 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63  cellbody = alloc
22af0 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
22b00 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20  totalSize);.    
22b10 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
22b20 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
22b30 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e  ( pPage->nFree >
22b40 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  = 2*nCell );.   
22b50 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
22b60 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f   2*nCell;.    fo
22b70 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
22b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32  i++){.      put2
22b90 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70  byte(&data[cellp
22ba0 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  tr], cellbody);.
22bb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
22bc0 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
22bd0 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
22be0 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74  ]);.      cellpt
22bf0 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65  r += 2;.      ce
22c00 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b  llbody += aSize[
22c10 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  i];.    }.    as
22c20 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d  sert( cellbody==
22c30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
22c40 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20  leSize );.  }.  
22c50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e  pPage->nCell = n
22c60 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
22c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
22c80 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
22c90 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
22ca0 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
22cb0 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
22cc0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
22cd0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
22ce0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
22cf0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
22d00 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
22d10 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
22d20 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
22d30 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
22d40 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
22d50 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
22d60 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
22d70 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
22d80 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
22d90 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
22da0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
22db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
22dc0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
22dd0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
22de0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
22df0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
22e00 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
22e10 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
22e20 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
22e30 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
22e40 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
22e50 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
22e60 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
22e70 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
22e80 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
22e90 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
22ea0 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
22eb0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
22ec0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
22ed0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
22ee0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22ef0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
22f00 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
22f10 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
22f20 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
22f30 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
22f40 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
22f50 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
22f60 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
22f70 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
22f80 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a  balance(MemPage*
22f90 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
22fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
22fb0 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
22fc0 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
22fd0 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
22fe0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
22ff0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
23000 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
23010 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
23020 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
23030 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
23040 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
23050 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
23060 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
23070 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
23080 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
23090 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
230a0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
230b0 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
230c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
230d0 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
230e0 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
230f0 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
23100 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
23110 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
23120 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
23130 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
23140 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
23150 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
23160 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
23170 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
23180 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
23190 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
231a0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
231b0 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
231c0 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
231d0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
231e0 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
231f0 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
23200 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
23210 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
23220 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
23230 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
23240 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
23250 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
23260 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
23270 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
23280 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
23290 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
232a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
232b0 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
232c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
232d0 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
232e0 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61  ge *pPage, MemPa
232f0 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
23300 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
23310 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20  e *pNew;.  Pgno 
23320 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70  pgnoNew;.  u8 *p
23330 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65  Cell;.  u16 szCe
23340 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ll;.  CellInfo i
23350 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20  nfo;.  BtShared 
23360 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
23370 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49  t;.  int parentI
23380 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  dx = pParent->nC
23390 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e  ell;   /* pParen
233a0 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  t new divider ce
233b0 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
233c0 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20  t parentSize;   
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64  /* Size of new d
233f0 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
23400 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36   u8 parentCell[6
23410 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
23420 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23430 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
23440 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  cell */..  asser
23450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23460 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
23470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
23480 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
23490 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68   page. Insert th
234a0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
234b0 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20  from pPage.  ** 
234c0 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  into it. Then re
234d0 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  move the overflo
234e0 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
234f0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  e..  */.  rc = a
23500 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
23510 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
23520 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  noNew, 0, 0);.  
23530 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23540 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
23550 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20  rc;.  }.  pCell 
23560 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
23570 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c  ].pCell;.  szCel
23580 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
23590 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
235a0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
235b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29  pPage->aData[0])
235c0 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ;.  assemblePage
235d0 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
235e0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50  , &szCell);.  pP
235f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
23600 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   0;..  /* Set th
23610 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
23620 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
23630 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e  page to pParent.
23640 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72   */.  pNew->pPar
23650 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
23660 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
23670 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
23680 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20  e);..  /* pPage 
23690 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
236a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
236b0 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
236c0 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61  this.  ** so tha
236d0 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
236e0 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
236f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
23700 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65  e and.  ** pPage
23710 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
23720 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
23730 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23740 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
23750 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
23760 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
23770 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69  nCell-1);.  sqli
23780 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
23790 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
237a0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20  l, &info);.  rc 
237b0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
237c0 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
237d0 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
237e0 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
237f0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
23800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23820 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
23830 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63  tSize<64 );.  rc
23840 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
23850 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
23860 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
23870 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
23880 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
238a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74  rn rc;.  }.  put
238b0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
238c0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
238d0 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
238e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
238f0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
23900 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
23910 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
23920 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ew);..#ifndef SQ
23930 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23940 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69  CUUM.  /* If thi
23950 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
23960 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
23970 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
23980 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
23990 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
239a0 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
239b0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
239c0 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
239d0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
239e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
239f0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
23a00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23a10 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
23a20 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
23a30 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
23a40 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  nt->pgno);.    i
23a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
23a70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
23a80 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w, 0);.    }.   
23a90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
23ab0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
23ac0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23ad0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23ae0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
23af0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
23b00 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64  the new page and
23b10 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
23b20 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69  ent page,.  ** i
23b30 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  n case the divid
23b40 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
23b50 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
23b60 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
23b70 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67   */.  releasePag
23b80 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
23b90 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e  n balance(pParen
23ba0 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  t, 0);.}.#endif 
23bb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
23bc0 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
23bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
23be0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
23bf0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
23c00 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
23c10 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
23c20 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
23c30 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
23c40 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
23c50 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
23c60 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
23c70 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
23c80 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
23c90 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
23ca0 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
23cb0 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
23cc0 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
23cd0 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
23ce0 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
23cf0 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
23d00 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
23d10 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
23d20 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
23d30 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
23d40 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
23d50 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
23d60 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
23d70 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
23d80 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
23d90 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
23da0 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
23db0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
23dc0 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
23dd0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
23de0 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
23df0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
23e00 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
23e10 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
23e20 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
23e30 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
23e40 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
23e50 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
23e60 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
23e70 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
23e80 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
23e90 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
23ea0 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
23eb0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
23ec0 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
23ed0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
23ee0 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
23ef0 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
23f00 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
23f10 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
23f20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
23f30 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
23f40 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
23f50 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
23f60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23f70 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
23f80 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
23f90 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
23fa0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
23fb0 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
23fc0 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
23fd0 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
23fe0 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
23ff0 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
24000 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
24010 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
24020 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
24030 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
24040 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
24050 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
24060 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
24070 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
24080 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
24090 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
240a0 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
240b0 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
240c0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
240d0 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
240e0 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
240f0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
24100 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
24110 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
24120 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
24130 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
24140 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
24150 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
24160 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
24170 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
24180 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
24190 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
241a0 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
241b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
241c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
241d0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
241e0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
241f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
24200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
24210 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
24220 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
24230 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
24240 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
24250 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
24260 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
24290 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
242a0 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
242b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
242c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
242d0 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
242e0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
242f0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24310 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24320 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
24330 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24350 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24360 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
24370 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24390 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
243a0 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
243b0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
243e0 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
24410 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
24420 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
24430 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
24440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
24450 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
24460 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
24470 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
244a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
244b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
244c0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
244d0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
244e0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
244f0 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24510 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
24520 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
24530 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
24540 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
24550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24560 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
24570 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
24580 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
24590 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
245a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
245b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
245c0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
245d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
245e0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
245f0 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
24600 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
24610 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b   int iSpace = 0;
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24630 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
24640 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a  te of aSpace[] *
24650 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
24660 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
24670 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
24680 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
24690 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
246a0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
246b0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
246c0 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
246d0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
246e0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
246f0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
24700 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
24710 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
24720 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
24730 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
24740 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
24750 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
24760 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
24770 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
24780 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
24790 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
247a0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
247b0 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
247c0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
247e0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
247f0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
24800 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
24810 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24820 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
24830 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
24840 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
24850 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
24860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24870 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
24880 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
24890 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
248a0 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
248b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
248c0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
248d0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
248e0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
248f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
24900 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
24910 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
24920 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
24930 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
24940 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
24950 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
24960 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
24970 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  aSpace;         
24980 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24990 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73  e to hold copies
249a0 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
249b0 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ls */.#ifndef SQ
249c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
249d0 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d  CUUM.  u8 *aFrom
249e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
249f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24a00 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
24a10 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
24a20 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
24a30 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
24a40 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
24a50 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
24a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24a70 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
24a80 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
24a90 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
24aa0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
24ab0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
24ac0 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
24ad0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
24ae0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
24af0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
24b00 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
24b10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
24b20 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20  rent->pDbPage)) 
24b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24b40 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  ;.  }.  TRACE(("
24b50 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
24b60 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
24b70 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
24b80 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
24b90 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
24ba0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
24bb0 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
24bc0 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
24bd0 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
24be0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
24bf0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
24c00 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
24c10 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
24c20 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
24c30 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
24c40 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
24c50 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
24c60 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
24c70 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24c80 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
24c90 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
24ca0 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
24cb0 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
24cc0 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
24cd0 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
24ce0 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
24cf0 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
24d00 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
24d10 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
24d20 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
24d30 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
24d40 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
24d50 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
24d60 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
24d70 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
24d80 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a  ge->leafData &&.
24d90 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
24da0 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
24db0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
24dc0 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
24dd0 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
24de0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
24df0 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
24e00 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
24e10 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
24e20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
24e30 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
24e40 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
24e50 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
24e60 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
24e70 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
24e80 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
24e90 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
24ea0 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
24eb0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
24ec0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
24ed0 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
24ee0 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ck(pPage, pParen
24ef0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
24f00 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
24f10 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
24f20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
24f30 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
24f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24f50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
24f60 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
24f70 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73  parent page whos
24f80 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69  e left child poi
24f90 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f  nts back.  ** to
24fa0 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64   pPage.  The "id
24fb0 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  x" variable is t
24fc0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
24fd0 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65   cell.  If pPage
24fe0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67  .  ** is the rig
24ff0 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  htmost child of 
25000 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74  pParent then set
25010 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d   idx to pParent-
25020 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69  >nCell .  */.  i
25030 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  f( pParent->idxS
25040 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  hift ){.    Pgno
25050 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20   pgno;.    pgno 
25060 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  = pPage->pgno;. 
25070 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
25080 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
25090 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
250a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66  DbPage) );.    f
250b0 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50  or(idx=0; idx<pP
250c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64  arent->nCell; id
250d0 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  x++){.      if( 
250e0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
250f0 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29  l(pParent, idx))
25100 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ==pgno ){.      
25110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25120 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25130 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  t( idx<pParent->
25140 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  nCell.          
25150 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26     || get4byte(&
25160 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
25170 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
25180 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20  t+8])==pgno );. 
25190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20   }else{.    idx 
251a0 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65  = pPage->idxPare
251b0 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  nt;.  }..  /*.  
251c0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61  ** Initialize va
251d0 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20  riables so that 
251e0 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20  it will be safe 
251f0 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72  to jump.  ** dir
25200 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65  ectly to balance
25210 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20  _cleanup at any 
25220 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  moment..  */.  n
25230 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a  Old = nNew = 0;.
25240 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
25250 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
25260 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ge);..  /*.  ** 
25270 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
25280 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
25290 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
252a0 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
252b0 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
252c0 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
252d0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
252e0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
252f0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
25300 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
25310 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
25320 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
25330 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
25340 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
25350 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
25360 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
25370 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
25380 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
25390 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
253a0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
253b0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
253c0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
253d0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
253e0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
253f0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
25400 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
25410 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
25420 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
25430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
25440 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
25450 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
25460 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
25470 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
25480 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
25490 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
254a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
254b0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
254c0 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
254d0 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
254e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
254f0 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
25500 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
25510 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
25520 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
25530 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
25540 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
25550 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
25560 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25570 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25580 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
25590 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
255a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
255b0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
255c0 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
255d0 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72   &apOld[i], pPar
255e0 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
255f0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
25600 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f  cleanup;.    apO
25610 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74  ld[i]->idxParent
25620 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79   = k;.    apCopy
25630 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  [i] = 0;.    ass
25640 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a  ert( i==nOld );.
25650 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20      nOld++;.    
25660 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
25670 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
25680 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
25690 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ow;.  }..  /* Ma
256a0 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
256b0 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
256c0 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
256d0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
256e0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
256f0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
25700 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
25710 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
25720 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
25730 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
25740 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
25750 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20 20  ite3_malloc( .  
25760 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
25770 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25790 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
257a0 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
257b0 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
257e0 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a     + (ROUND8(siz
257f0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42  eof(MemPage))+pB
25800 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20  t->pageSize)*NB 
25810 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
25820 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
25830 65 2a 35 20 20 20 20 20 20 20 20 20 20 20 20 20  e*5             
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25850 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20  /* aSpace */.   
25860 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
25870 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
25880 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
25890 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b  /* aFrom */.  );
258a0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
258b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
258c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
258d0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
258e0 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
258f0 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
25900 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
25910 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29  aCopy[0] = (u8*)
25920 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
25930 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  s];.  assert( ((
25940 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29  aCopy[0] - (u8*)
25950 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
25960 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
25970 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
25980 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
25990 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43  NB; i++){.    aC
259a0 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b  opy[i] = &aCopy[
259b0 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  i-1][pBt->pageSi
259c0 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
259d0 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20  (MemPage))];.   
259e0 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
259f0 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [i] - (u8*)apCel
25a00 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
25a10 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
25a20 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
25a30 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61 43  }.  aSpace = &aC
25a40 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
25a50 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
25a60 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
25a70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
25a80 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65  pace - (u8*)apCe
25a90 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
25aa0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
25ab0 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23  nt required */.#
25ac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25ad0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25ae0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
25af0 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  uum ){.    aFrom
25b00 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74   = &aSpace[5*pBt
25b10 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
25b20 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a  .#endif.  .  /*.
25b30 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    ** Make copies
25b40 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
25b50 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73  of pPage and its
25b60 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61   siblings into a
25b70 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20  Old[]..  ** The 
25b80 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
25b90 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
25ba0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
25bb0 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20  ies rather.  ** 
25bc0 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
25bd0 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
25be0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
25bf0 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
25c00 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
25c10 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
25c20 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
25c30 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
25c40 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20  .    MemPage *p 
25c50 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d  = apCopy[i] = (M
25c60 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d  emPage*)aCopy[i]
25c70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
25c80 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
25c90 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
25ca0 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  p->aData = (void
25cb0 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  *)&p[1];.    mem
25cc0 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
25cd0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
25ce0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
25cf0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
25d00 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
25d10 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
25d20 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
25d30 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
25d40 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
25d50 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
25d60 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
25d70 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
25d80 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
25d90 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
25da0 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
25db0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
25dc0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
25dd0 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
25de0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
25df0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
25e00 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
25e10 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
25e20 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
25e30 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
25e40 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
25e50 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
25e60 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
25e70 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
25e80 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
25e90 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
25ea0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
25eb0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
25ec0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
25ed0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
25ee0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
25ef0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
25f00 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
25f10 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
25f20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
25f30 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25f40 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
25f50 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
25f60 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
25f70 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
25f80 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
25f90 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
25fa0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
25fb0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
25fc0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
25fd0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
25fe0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
25ff0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
26000 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
26010 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
26020 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
26030 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
26040 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
26050 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
26060 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
26070 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
26080 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
26090 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
260a0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
260b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
260c0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
260d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
260e0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
260f0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
26100 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
26110 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
26120 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
26130 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
26140 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
26150 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
26160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26170 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
26180 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
261a0 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
261b0 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
261c0 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
261d0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
261e0 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
261f0 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
26200 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
26210 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
26220 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
26230 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
26240 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
26250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26260 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
26270 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
26280 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
26290 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
262a0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c      u16 sz = cel
262b0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
262c0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
262d0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
262e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
262f0 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
26300 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
26310 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
26320 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
26330 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
26340 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
26350 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
26360 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
26370 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
26380 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
26390 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
263a0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
263b0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
263c0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
263d0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
263e0 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
263f0 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
26400 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
26410 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
26420 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26430 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
26440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
26450 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
26460 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
26470 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
26480 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
26490 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
264a0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
264b0 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
264c0 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
264d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
264e0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
264f0 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
26500 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
26510 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
26520 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
26530 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
26540 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
26550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26560 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26570 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26580 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26590 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
265a0 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
265b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
265c0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
265d0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
265e0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
265f0 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
26600 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
26610 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26620 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
26630 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
26640 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
26650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26660 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
26670 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
26680 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
26690 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
266a0 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
266b0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
266c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
266d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
266e0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
266f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
26700 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
26710 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
26720 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
26730 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26740 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26750 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
26760 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
26770 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
26780 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
26790 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
267a0 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
267b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
267c0 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
267d0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
267e0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
267f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26800 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
26810 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26820 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
26830 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
26840 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
26850 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
26860 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
26870 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
26880 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
26890 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
268a0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
268b0 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
268c0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
268d0 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
268e0 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
268f0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
26900 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
26910 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
26920 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
26930 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
26940 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
26950 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
26960 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
26970 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
26980 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
26990 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
269a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
269b0 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
269c0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
269d0 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
269e0 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
269f0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
26a00 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
26a10 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
26a20 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
26a30 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
26a40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
26a50 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
26a60 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
26a70 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
26a80 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
26a90 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
26aa0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
26ab0 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
26ac0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
26ad0 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
26ae0 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
26af0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
26b00 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
26b10 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
26b20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
26b30 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26b40 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
26b50 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
26b60 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
26b70 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
26b80 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
26b90 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
26ba0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
26bb0 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
26bc0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
26bd0 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
26be0 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
26bf0 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
26c00 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
26c10 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
26c20 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
26c30 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
26c40 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
26c50 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
26c60 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
26c70 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
26c80 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
26c90 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
26ca0 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
26cb0 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
26cc0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
26cd0 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
26ce0 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
26cf0 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
26d00 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
26d10 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
26d20 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
26d30 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
26d40 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
26d50 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
26d60 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
26d70 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
26d80 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
26d90 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
26da0 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
26db0 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
26dc0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
26dd0 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
26de0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
26df0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
26e00 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
26e10 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
26e20 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
26e30 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
26e40 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
26e50 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
26e60 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
26e70 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
26e80 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
26e90 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
26ea0 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
26eb0 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
26ec0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
26ed0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
26ee0 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
26ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26f00 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
26f10 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
26f20 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
26f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26f40 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
26f50 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
26f60 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
26f70 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
26f80 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
26f90 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
26fa0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
26fb0 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
26fc0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
26fd0 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
26fe0 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
26ff0 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
27000 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
27010 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
27020 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
27030 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
27040 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
27050 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
27060 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
27070 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
27080 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
27090 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
270a0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
270b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
270c0 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
270d0 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
270e0 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
270f0 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
27100 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
27110 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
27120 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
27130 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
27140 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
27150 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27160 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
27170 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
27180 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
27190 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
271a0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
271b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
271c0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
271d0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
271e0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
271f0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
27200 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
27210 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
27220 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
27230 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
27240 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
27250 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
27260 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
27270 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
27280 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
27290 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
272a0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
272b0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
272c0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
272d0 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
272e0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
272f0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
27300 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
27310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27320 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
27330 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
27340 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
27350 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
27360 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
27380 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
27390 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
273a0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
273b0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
273c0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
273d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
273e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
273f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
27400 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
27410 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
27420 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65    }.    zeroPage
27430 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
27440 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
27450 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
27460 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
27470 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
27480 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
27490 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
274a0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
274b0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
274c0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
274d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
274e0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
274f0 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
27500 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
27510 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27520 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
27530 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
27540 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
27550 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
27560 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
27570 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
27580 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
27590 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
275a0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
275b0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
275c0 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
275d0 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
275e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
275f0 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
27600 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
27610 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
27620 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
27630 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
27640 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
27650 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
27660 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
27670 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
27680 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
27690 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
276a0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
276b0 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
276c0 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
276d0 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
276e0 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
276f0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
27700 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
27710 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
27720 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
27730 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
27740 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
27750 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
27760 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
27770 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
27780 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
27790 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
277a0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
277b0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
277c0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
277d0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
277e0 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
277f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
27800 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
27810 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
27820 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
27830 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
27840 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
27850 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
27860 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
27870 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
27880 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
27890 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
278a0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
278b0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
278c0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
278d0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
278e0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
278f0 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
27900 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
27910 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
27920 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
27930 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
27940 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
27950 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
27960 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
27970 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
27980 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
27990 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
279a0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
279b0 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
279c0 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
279d0 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
279e0 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
279f0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
27a00 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
27a10 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
27a20 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
27a30 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
27a40 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
27a50 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
27a60 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
27a70 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
27a80 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
27a90 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
27aa0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
27ab0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
27ac0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
27ad0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
27ae0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
27af0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
27b00 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
27b10 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
27b20 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
27b30 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
27b40 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
27b50 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
27b60 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
27b70 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
27b80 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61  oNew[i] );.    a
27b90 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
27ba0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
27bb0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
27bc0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
27bd0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
27be0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
27bf0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
27c00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
27c10 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
27c20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
27c30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27c40 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
27c50 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
27c60 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
27c70 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
27c80 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
27c90 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
27ca0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
27cb0 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
27cc0 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
27cd0 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
27ce0 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
27cf0 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
27d00 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
27d10 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
27d20 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
27d30 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
27d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
27d50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
27d60 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
27d70 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
27d80 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
27d90 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
27da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
27db0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
27dc0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
27dd0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
27de0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
27df0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
27e00 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
27e10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27e30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
27e40 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27e50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27e70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
27e80 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
27e90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
27ea0 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
27eb0 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
27ec0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
27ed0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
27ee0 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
27ef0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
27f00 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
27f10 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
27f20 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
27f30 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
27f40 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
27f50 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
27f60 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
27f70 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
27f80 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
27f90 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
27fa0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
27fb0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
27fc0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
27fd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
27fe0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
27ff0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
28000 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   4);.        pTe
28010 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
28020 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
28030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28040 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
28050 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
28060 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
28070 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
28080 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
28090 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
280a0 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
280b0 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
280c0 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
280d0 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
280e0 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
280f0 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
28100 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
28110 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
28120 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
28130 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
28140 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
28150 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
28160 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
28170 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
28180 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
28190 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
281a0 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
281b0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53       pCell = &aS
281c0 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
281d0 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c        fillInCell
281e0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
281f0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
28200 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
28210 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
28220 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
28230 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
28240 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
28250 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
28260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28270 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
28280 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  4;.        pTemp
28290 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
282a0 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
282b0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
282c0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
282d0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
282e0 35 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 );.        /* 
282f0 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
28300 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
28310 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
28320 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
28330 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
28340 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
28350 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
28360 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
28370 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
28380 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
28390 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
283a0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
283b0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
283c0 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
283d0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
283e0 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
283f0 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
28400 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
28410 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
28420 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
28430 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
28440 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
28450 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
28460 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
28470 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
28480 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
28490 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
284a0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
284b0 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
284c0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
284d0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
284e0 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
284f0 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
28500 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
28510 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
28520 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
28530 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
28540 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
28550 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
28560 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
28570 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
28580 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
28590 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
285a0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
285b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
285c0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
285d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
285e0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
285f0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
28600 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
28610 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
28620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28630 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28640 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
28650 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
28660 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
28670 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
28680 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
28690 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
286a0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
286b0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
286c0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
286d0 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
286e0 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
286f0 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
28700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
28710 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
28720 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
28730 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
28740 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
28750 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
28760 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
28770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
28780 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28790 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
287a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
287b0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
287c0 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
287d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
287e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
287f0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
28800 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
28810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
28820 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
28830 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
28840 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
28850 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
28860 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
28870 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
28880 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
28890 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
288a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
288b0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
288c0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
288d0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
288e0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
288f0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
28900 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
28910 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
28920 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
28930 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
28940 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
28950 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
28960 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
28970 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
28980 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
28990 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
289a0 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
289b0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
289c0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
289d0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
289e0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
289f0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
28a00 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
28a10 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
28a20 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
28a30 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
28a40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
28a50 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
28a60 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
28a70 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
28a80 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
28a90 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
28aa0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
28ab0 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
28ac0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
28ad0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
28ae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28af0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
28b00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
28b10 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
28b20 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
28b30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28b40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
28b50 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
28b60 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
28b70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
28b80 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
28b90 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
28ba0 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
28bb0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
28bc0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
28bd0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
28be0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
28bf0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
28c00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
28c10 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
28c20 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
28c30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
28c40 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
28c50 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
28c60 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
28c70 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
28c80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
28c90 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
28ca0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
28cb0 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
28cc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
28cd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
28ce0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
28cf0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
28d00 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
28d10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28d20 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apNew[i]);.  }. 
28d30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
28d40 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28  rent);.  TRACE((
28d50 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
28d60 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d  ed with %d: old=
28d70 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
28d80 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
28d90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f   pPage->pgno, nO
28da0 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
28db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
28dd0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
28de0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
28df0 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
28e00 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
28e10 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28e20 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
28e30 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
28e40 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
28e50 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
28e60 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
28e70 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
28e80 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67  shallower(MemPag
28e90 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
28ea0 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
28eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28ec0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
28ed0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
28ee0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28f00 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
28f10 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
28f20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
28f30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28f40 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
28f50 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
28f60 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f80 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
28f90 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
28fa0 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
28fb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
28fc0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
28fd0 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
28fe0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
28ff0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29000 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
29010 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
29020 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
29030 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
29040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29050 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
29060 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
29070 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
29080 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
29090 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
290a0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
290b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
290c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
290d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20  mutex) );.  pBt 
290e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
290f0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
29100 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
29110 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
29120 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  _malloc( mxCellP
29130 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
29140 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
29150 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
29160 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
29170 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
29180 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
29190 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
291a0 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
291b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
291c0 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
291d0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
291e0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
291f0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
29200 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
29210 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
29220 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
29230 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
29240 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
29250 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
29260 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
29270 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
29280 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
29290 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
292a0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
292b0 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
292c0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
292d0 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
292e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
292f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
29300 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
29310 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
29320 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
29330 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
29340 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
29350 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
29360 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
29370 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
29380 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
29390 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
293a0 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
293b0 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
293c0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
293d0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
293e0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
293f0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
29400 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
29410 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
29420 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
29430 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
29440 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
29450 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
29460 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
29470 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
29480 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
29490 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
294a0 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
294b0 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
294c0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
294d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
294e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
294f0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
29500 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
29510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29520 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
29530 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
29540 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
29550 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
29560 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
29570 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
29580 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
29590 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
295a0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
295b0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
295c0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
295d0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
295e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
295f0 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
29600 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
29610 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
29620 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29630 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29640 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
29650 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
29660 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
29670 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
29680 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
29690 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
296a0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
296b0 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
296c0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
296d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
296e0 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
296f0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
29700 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
29710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
29720 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
29730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
29740 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
29750 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
29760 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
29770 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
29780 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
29790 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
297a0 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
297b0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
297c0 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
297d0 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
297e0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
297f0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
29800 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
29810 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
29820 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29830 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
29840 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
29850 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
29860 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
29870 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
29880 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
29890 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
298a0 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
298b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
298c0 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
298d0 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
298e0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
298f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29900 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
29910 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
29920 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
29930 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
29940 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
29950 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
29960 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
29970 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
29980 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29990 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
299a0 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
299b0 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
299c0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
299d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
299e0 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
299f0 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
29a00 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
29a10 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
29a20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
29a30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
29a40 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
29a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29a60 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
29a70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
29a80 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
29a90 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
29aa0 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
29ab0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
29ac0 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
29ad0 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
29ae0 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
29af0 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
29b00 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
29b10 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
29b20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
29b30 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a  ldPages(pPage);.
29b40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29b50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
29b60 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
29b70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29b80 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
29b90 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
29ba0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29bb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
29bc0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a  ->nCell; i++){ .
29bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29be0 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65  mapPutOvfl(pPage
29bf0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
29c00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29c10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29c20 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
29c30 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  lance;.        }
29c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
29c50 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73  endif.    releas
29c60 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
29c70 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
29c80 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
29c90 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  3_free(apCell);.
29ca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29cb0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  ./*.** The root 
29cc0 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
29cd0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
29ce0 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65   happens, Create
29cf0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
29d00 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a  e and copy the.*
29d10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
29d20 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20  e root into the 
29d30 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b  child.  Then mak
29d40 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  e the root.** pa
29d50 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  ge an empty page
29d60 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64   with rightChild
29d70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
29d80 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20   new.** child.  
29d90 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62   Finally, call b
29da0 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28  alance_internal(
29db0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69  ) on the new chi
29dc0 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69  ld.** to cause i
29dd0 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73  t to split..*/.s
29de0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
29df0 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
29e00 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
29e10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29e20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
29e30 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
29e40 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
29e50 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
29e60 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
29e70 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
29e80 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
29e90 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
29ea0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
29eb0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
29ec0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
29ed0 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
29ee0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
29ef0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
29f00 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
29f10 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
29f20 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
29f30 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
29f40 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29f50 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
29f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
29f70 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
29f80 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
29f90 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
29fa0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
29fb0 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
29fc0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  nt */.  int brk;
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29fe0 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
29ff0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2a000 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2a010 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
2a020 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
2a030 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2a040 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42  erflow>0 );.  pB
2a050 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2a060 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a070 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2a080 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2a090 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2a0a0 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c  Page(pBt, &pChil
2a0b0 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70  d, &pgnoChild, p
2a0c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  Page->pgno, 0);.
2a0d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a0e0 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
2a0f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a100 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
2a110 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73  pDbPage) );.  us
2a120 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
2a130 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
2a140 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2a150 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
2a160 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62  ->hdrOffset;.  b
2a170 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2a180 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2a190 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2a1a0 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2a1b0 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2a1c0 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2a1d0 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2a1e0 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2a1f0 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26  y(&cdata[brk], &
2a200 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
2a210 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73  eSize-brk);.  as
2a220 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
2a230 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
2a240 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2a250 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
2a260 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2a270 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2a280 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
2a290 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
2a2a0 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
2a2b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a2c0 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
2a2d0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
2a2e0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2a2f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a300 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
2a310 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2a320 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2a330 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2a340 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2a350 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2a360 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
2a370 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2a380 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
2a390 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2a3a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2a3b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2a3c0 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
2a3d0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2a3e0 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2a3f0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2a400 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2a410 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  no));.#ifndef SQ
2a420 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2a430 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
2a440 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2a450 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
2a460 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2a470 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
2a480 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2a490 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
2a4a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2a4b0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2a4c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a4d0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2a4e0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
2a4f0 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
2a500 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
2a510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a530 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2a540 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2a550 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2a560 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
2a570 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f  .balancedeeper_o
2a580 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2a590 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  e(pChild);.  ret
2a5a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a5b0 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70   Decide if the p
2a5c0 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20  age pPage needs 
2a5d0 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20  to be balanced. 
2a5e0 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73   If balancing is
2a5f0 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61  .** required, ca
2a600 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ll the appropria
2a610 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  te balancing rou
2a620 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
2a630 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
2a640 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2a650 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  insert){.  int r
2a660 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a670 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a680 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2a690 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2a6a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
2a6b0 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
2a6c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a6d0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2a6e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2a6f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a700 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
2a710 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
2a720 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
2a730 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
2a740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a750 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2a760 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
2a770 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
2a780 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
2a790 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2a7a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2a7b0 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
2a7c0 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20         (!insert 
2a7d0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2a7e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2a7f0 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2a800 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2a810 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29  e_nonroot(pPage)
2a820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a840 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2a850 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
2a860 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
2a870 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
2a880 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
2a890 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20  se cursors were 
2a8a0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
2a8b0 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65  ag==0 in a diffe
2a8c0 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
2a8d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64   connection (a d
2a8e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2a8f0 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74  on that shares t
2a900 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68  he pager.** cach
2a910 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  e with the curre
2a920 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  nt connection) a
2a930 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f  nd that other co
2a940 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nnection .** is 
2a950 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55  not in the ReadU
2a960 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74  ncommmitted stat
2a970 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
2a980 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tine returns .**
2a990 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
2a9a0 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
2a9b0 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
2a9c0 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
2a9d0 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
2a9e0 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
2a9f0 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
2aa00 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
2aa10 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
2aa20 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63  s.** all write c
2aa30 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74  ursors so that t
2aa40 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
2aa50 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   to the .** firs
2aa60 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f  t Cell on the ro
2aa70 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  ot page.  This i
2aa80 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
2aa90 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a  use an insert .*
2aaa0 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68  * or delete migh
2aab0 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d  t change the num
2aac0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
2aad0 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65  a page or delete
2aae0 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72  .** a page entir
2aaf0 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f  ely and we do no
2ab00 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20  t want to leave 
2ab10 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20  any cursors .** 
2ab20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d  pointing to non-
2ab30 65 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f  existant pages o
2ab40 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  r cells..*/.stat
2ab50 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64  ic int checkRead
2ab60 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74  Locks(Btree *pBt
2ab70 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  ree, Pgno pgnoRo
2ab80 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
2ab90 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72  xclude){.  BtCur
2aba0 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72  sor *p;.  BtShar
2abb0 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65  ed *pBt = pBtree
2abc0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2abd0 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64   *db = pBtree->d
2abe0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
2abf0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2ac00 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
2ac10 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2ac20 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2ac30 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
2ac40 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
2ac50 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2ac60 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ac70 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2ac80 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2ac90 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2aca0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2acb0 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2acc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2acd0 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
2ace0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
2acf0 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20   if( dbOther==0 
2ad00 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f  ||.         (dbO
2ad10 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f  ther!=db && (dbO
2ad20 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51  ther->flags & SQ
2ad30 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2ad40 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  tted)==0) ){.   
2ad50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ad60 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
2ad70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2ad80 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21   p->pPage->pgno!
2ad90 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  =p->pgnoRoot ){.
2ada0 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74        moveToRoot
2adb0 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
2adc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2add0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2ade0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2adf0 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2ae00 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2ae10 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2ae20 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2ae30 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2ae40 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2ae50 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2ae60 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2ae70 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2ae80 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2ae90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2aea0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2aeb0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2aec0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2aed0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2aee0 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2aef0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2af00 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2af10 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2af20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2af30 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2af40 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2af50 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2af60 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2af70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2af80 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2af90 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2afa0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2afb0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2afc0 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2afd0 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2afe0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2aff0 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2b000 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2b010 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2b020 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2b030 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2b040 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2b050 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2b060 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2b070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b080 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2b090 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2b0a0 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2b0b0 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0d0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b0e0 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2b0f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2b100 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2b110 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61  t szNew;.  MemPa
2b120 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
2b130 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
2b140 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
2b150 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b160 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2b170 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
2b180 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
2b190 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
2b1a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2b1b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
2b1c0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2b1d0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2b1e0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2b1f0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2b200 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2b210 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ng an insert */.
2b220 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2b230 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2b240 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2b250 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2b260 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2b270 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2b280 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
2b290 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2b2a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b2b0 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2b2c0 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2b2d0 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2b2e0 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2b2f0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2b300 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2b310 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2b320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2b330 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2b340 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2b350 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2b360 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2b370 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b380 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2b390 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2b3a0 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
2b3b0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2b3c0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2b3d0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
2b3e0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65  s table */.  cle
2b3f0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2b400 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20  (pCur);.  if( . 
2b410 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2b420 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2b430 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2b440 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
2b450 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  |.    SQLITE_OK!
2b460 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
2b470 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
2b480 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
2b490 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
2b4a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2b4b0 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  c;.  }..  pPage 
2b4c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2b4d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b4e0 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d  intKey || nKey>=
2b4f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b500 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70  Page->leaf || !p
2b510 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29  Page->leafData )
2b520 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
2b530 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
2b540 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
2b550 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
2b560 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2b570 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
2b580 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
2b590 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
2b5a0 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
2b5b0 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
2b5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b5d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2b5e0 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  newCell = sqlite
2b5f0 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c  3_malloc( MX_CEL
2b600 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2b610 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
2b620 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b630 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
2b640 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
2b650 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
2b660 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
2b670 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
2b680 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2b690 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2b6a0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
2b6b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2b6c0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
2b6d0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
2b6e0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2b6f0 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
2b700 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2b710 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2b720 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
2b730 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2b740 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
2b750 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
2b760 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
2b770 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b780 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2b790 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2b7a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
2b7b0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
2b7c0 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
2b7d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2b7e0 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
2b7f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b800 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2b810 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2b820 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2b830 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2b840 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2b850 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2b860 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2b870 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2b880 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2b890 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2b8a0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b8b0 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2b8c0 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2b8d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2b8e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b8f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2b900 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2b910 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2b920 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
2b930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2b940 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2b950 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2b960 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b970 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
2b980 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
2b990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b9a0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2b9b0 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  t;.  rc = balanc
2b9c0 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f  e(pPage, 1);.  /
2b9d0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
2b9e0 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74  geDump(pCur->pBt
2b9f0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2ba00 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66  , 1); */.  /* ff
2ba10 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
2ba20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ba30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2ba40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2ba50 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2ba60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e 65 77  sqlite3_free(new
2ba70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
2ba80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2ba90 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
2baa0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
2bab0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
2bac0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2bad0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2bae0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
2baf0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
2bb00 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
2bb10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2bb20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2bb30 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2bb40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2bb50 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  pCell;.  int rc;
2bb60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2bb70 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a  d = 0;.  Btree *
2bb80 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2bb90 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2bba0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2bbb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2bbc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2bbd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2bbe0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2bbf0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2bc00 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2bc10 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2bc20 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2bc30 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2bc40 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  g a delete */.  
2bc50 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2bc60 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2bc70 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2bc80 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2bc90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2bca0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2bcb0 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ly );.  if( pCur
2bcc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bcd0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
2bce0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
2bcf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2bd00 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e  >idx >= pPage->n
2bd10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Cell ){.    retu
2bd20 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2bd30 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2bd40 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2bd50 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  to anything */. 
2bd60 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e   }.  if( !pCur->
2bd70 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2bd80 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2bd90 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f  ;   /* Did not o
2bda0 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20  pen this cursor 
2bdb0 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2bdc0 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2bdd0 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2bde0 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2bdf0 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2be00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2be10 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2be20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2be30 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2be40 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  lock */.  }..  /
2be50 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
2be60 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2be70 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
2be80 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2be90 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
2bea0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2beb0 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
2bec0 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2bed0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2bee0 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
2bef0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
2bf00 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
2bf10 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2bf20 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
2bf30 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77  that the entry w
2bf40 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66  ill be deleted f
2bf50 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
2bf60 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f  .    (rc = resto
2bf70 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2bf80 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d  osition(pCur))!=
2bf90 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2bfa0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2bfb0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2bfc0 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  t, pCur))!=0 ||.
2bfd0 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
2bfe0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2bff0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a  e->pDbPage))!=0.
2c000 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2c010 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  rc;.  }..  /* Lo
2c020 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
2c030 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e  thin its page an
2c040 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f  d leave pCell po
2c050 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20  inting to the.  
2c060 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65  ** data. The cle
2c070 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72  arCell() call fr
2c080 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ees any overflow
2c090 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2c0a0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
2c0b0 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69  cell. The cell i
2c0c0 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69  tself is still i
2c0d0 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  ntact..  */.  pC
2c0e0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2c0f0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2c100 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2c110 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2c120 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2c130 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
2c140 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2c150 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
2c160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2c170 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
2c180 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c190 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2c1a0 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2c1b0 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2c1c0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2c1d0 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2c1e0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2c1f0 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2c200 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2c210 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2c220 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2c230 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2c240 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2c250 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2c260 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2c270 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2c280 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2c290 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c2a0 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2c2b0 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2c2c0 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2c2d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2c2e0 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2c2f0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2c300 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2c310 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
2c320 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
2c330 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
2c340 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c  ssert( !pPage->l
2c350 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 73  eafData );.    s
2c360 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
2c370 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26  mpCursor(pCur, &
2c380 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63  leafCur);.    rc
2c390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
2c3a0 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
2c3b0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
2c3c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c3d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2c3e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 6c  ite3PagerWrite(l
2c3f0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44  eafCur.pPage->pD
2c400 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
2c410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 31 36  _OK ){.      u16
2c430 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54   szNext;.      T
2c440 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2c450 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2c460 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2c470 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2c480 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2c490 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2c4a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2c4b0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2c4c0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2c4d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c4e0 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c4f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c500 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2c510 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2c520 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c530 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2c540 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2c550 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2c560 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2c570 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2c580 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2c590 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  +4 );.      temp
2c5a0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
2c5b0 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53  alloc( MX_CELL_S
2c5c0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  IZE(pBt) );.    
2c5d0 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
2c5e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2c5f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c620 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c630 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2c640 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65  , pCur->idx, pNe
2c650 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
2c660 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
2c670 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2c680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c690 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2c6a0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2c6b0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2c6c0 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29  idx), pgnoChild)
2c6d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
2c6e0 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2c6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f  K ){.        dro
2c720 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  pCell(leafCur.pP
2c730 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2c740 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20  , szNext);.     
2c750 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2c760 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 30  leafCur.pPage, 0
2c770 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c790 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20  e(tempCell);.   
2c7a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
2c7b0 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2c7c0 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73  leafCur);.  }els
2c7d0 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44  e{.    TRACE(("D
2c7e0 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2c7f0 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66  delete from leaf
2c800 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70   %d\n",.       p
2c810 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c820 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2c830 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2c840 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c  , pCur->idx, cel
2c850 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2c860 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20  pCell));.    rc 
2c870 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2c880 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2c890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c8a0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2c8b0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2c8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c8d0 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2c8e0 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2c8f0 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2c900 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2c910 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2c920 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2c930 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2c940 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2c950 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2c960 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2c970 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2c980 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2c990 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2c9a0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2c9b0 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2c9c0 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2c9d0 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2c9e0 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2c9f0 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2ca00 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2ca10 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2ca20 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2ca30 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2ca60 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
2ca70 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
2ca80 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2ca90 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2caa0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2cab0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2cac0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2cad0 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2cae0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
2caf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2cb00 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2cb10 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  (p) );.  if( pBt
2cb20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2cb30 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2cb40 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2cb50 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2cb60 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20  first */.    rc 
2cb70 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2cb80 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2cb90 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2cba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2cbb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2cbc0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2cbd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2cbe0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2cbf0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2cc00 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2cc10 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2cc20 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2cc30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2cc40 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
2cc50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2cc60 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2cc70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
2cc80 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
2cc90 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
2cca0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2ccb0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2ccc0 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
2ccd0 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
2cce0 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
2ccf0 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
2cd00 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
2cd10 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
2cd20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
2cd30 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
2cd40 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2cd50 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
2cd60 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
2cd70 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
2cd80 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
2cd90 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2cda0 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
2cdb0 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
2cdc0 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
2cdd0 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
2cde0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
2cdf0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
2ce00 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
2ce10 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
2ce20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
2ce30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2ce40 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
2ce50 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
2ce60 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2ce70 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
2ce80 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
2ce90 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
2cea0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
2ceb0 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
2cec0 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
2ced0 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
2cee0 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
2cef0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2cf00 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
2cf10 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2cf20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2cf40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67  rc;.    }.    pg
2cf50 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
2cf60 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
2cf70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
2cf80 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
2cf90 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2cfa0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
2cfb0 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
2cfc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
2cfd0 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
2cfe0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2cff0 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
2d000 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
2d010 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d020 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
2d030 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
2d040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2d050 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
2d060 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
2d070 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
2d080 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
2d090 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
2d0a0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2d0b0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
2d0c0 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
2d0d0 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
2d0e0 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
2d0f0 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
2d100 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
2d110 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
2d120 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2d130 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
2d140 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
2d150 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
2d160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d170 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d180 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2d190 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
2d1a0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
2d1b0 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
2d1c0 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
2d1d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
2d1e0 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
2d1f0 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
2d200 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
2d210 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
2d220 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
2d230 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
2d240 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
2d250 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
2d260 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
2d270 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2d280 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
2d290 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
2d2a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
2d2b0 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
2d2c0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
2d2d0 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
2d2e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d2f0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2d300 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
2d310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d320 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
2d330 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
2d340 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
2d350 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
2d360 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
2d370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2d380 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2d390 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2d3a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2d3b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d3c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d3d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2d3e0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2d3f0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2d400 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2d410 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2d420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2d430 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2d440 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2d450 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2d460 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d470 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d4a0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2d4b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2d4c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d4d0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2d4e0 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2d4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d500 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2d510 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2d520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d530 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d540 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d570 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2d580 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2d590 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2d5a0 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2d5b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2d5c0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
2d5d0 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
2d5e0 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
2d5f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d620 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2d630 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d640 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2d650 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2d660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d690 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2d6a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d6b0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2d6c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d6e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2d6f0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2d700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d710 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d720 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
2d730 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
2d740 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2d750 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
2d760 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
2d770 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2d780 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
2d790 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2d7a0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
2d7b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2d7c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2d7d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2d7e0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2d7f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d800 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2d810 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2d820 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
2d830 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2d840 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2d850 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2d860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d870 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
2d880 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2d890 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2d8a0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2d8b0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
2d8c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2d8d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
2d8e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2d8f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
2d900 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2d910 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
2d920 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
2d930 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  F);.  sqlite3Pag
2d940 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70  erUnref(pRoot->p
2d950 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61  DbPage);.  *piTa
2d960 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2d970 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2d980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
2d990 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
2d9a0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
2d9b0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
2d9c0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
2d9d0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
2d9e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2d9f0 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
2da00 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
2da10 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
2da20 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
2da30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2da40 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2da50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
2da60 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2da70 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2da80 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2da90 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2daa0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2dab0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2dac0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2dad0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2dae0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2daf0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2db00 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2db10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2db20 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2db30 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2db40 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2db50 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2db60 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2db70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2db80 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2db90 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2dba0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2dbb0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2dbc0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2dbd0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2dbe0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2dbf0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2dc00 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
2dc10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2dc20 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2dc30 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c  ;.  if( pgno>sql
2dc40 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2dc50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2dc60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2dc70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2dc80 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
2dc90 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2dca0 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c  t, pgno, &pPage,
2dcb0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28   pParent);.  if(
2dcc0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2dcd0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2dce0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2dcf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2dd00 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
2dd10 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2dd20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2dd30 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2dd40 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2dd50 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2dd60 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
2dd70 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2dd80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2dd90 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2dda0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
2ddb0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
2ddc0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2ddd0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2dde0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2ddf0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2de00 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2de10 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
2de20 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2de30 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2de40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
2de50 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ]), pPage->pPare
2de60 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  nt, 1);.    if( 
2de70 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2de80 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2de90 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
2dea0 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
2deb0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2dec0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
2ded0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2dee0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2def0 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
2df00 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2df10 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
2df20 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
2df30 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
2df40 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
2df50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2df60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2df70 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2df80 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2df90 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
2dfa0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
2dfb0 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
2dfc0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
2dfd0 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
2dfe0 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
2dff0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2e000 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
2e010 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2e020 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
2e030 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
2e040 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2e050 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2e060 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2e070 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2e080 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
2e090 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
2e0a0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
2e0b0 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
2e0c0 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
2e0d0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
2e0e0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2e0f0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2e100 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74  t iTable){.  int
2e110 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
2e120 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2e130 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2e140 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
2e150 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
2e160 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2e170 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2e180 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2e190 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2e1a0 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2e1b0 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
2e1c0 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c  (rc = checkReadL
2e1d0 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
2e1e0 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))!=SQLITE_OK )
2e1f0 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67  {.    /* nothing
2e200 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73   to do */.  }els
2e210 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21  e if( SQLITE_OK!
2e220 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
2e230 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c  rsors(pBt, iTabl
2e240 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a  e, 0)) ){.    /*
2e250 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   nothing to do *
2e260 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  /.  }else{.    r
2e270 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2e280 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  ePage(pBt, (Pgno
2e290 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a  )iTable, 0, 0);.
2e2a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
2e2b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
2e2c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e2d0 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
2e2e0 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
2e2f0 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
2e300 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
2e310 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
2e320 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
2e330 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
2e340 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
2e350 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
2e360 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
2e370 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2e380 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
2e390 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
2e3a0 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
2e3b0 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
2e3c0 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
2e3d0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2e3e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
2e3f0 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
2e400 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
2e410 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
2e420 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
2e430 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
2e440 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
2e450 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
2e460 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
2e470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2e480 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
2e490 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2e4a0 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
2e4b0 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
2e4c0 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
2e4d0 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
2e4e0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
2e4f0 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
2e500 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
2e510 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
2e520 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
2e530 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
2e540 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
2e550 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
2e560 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
2e570 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
2e580 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
2e590 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
2e5a0 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
2e5b0 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
2e5c0 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
2e5d0 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
2e5e0 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
2e5f0 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
2e600 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
2e610 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
2e620 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
2e630 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
2e640 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2e650 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
2e660 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
2e670 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
2e680 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
2e690 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
2e6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e6b0 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  btreeDropTable(B
2e6c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
2e6d0 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
2e6e0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2e6f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2e700 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
2e710 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2e720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e730 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2e740 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  p) );.  if( p->i
2e750 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
2e760 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
2e770 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
2e780 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2e790 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2e7a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69  ;.  }..  /* It i
2e7b0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f  s illegal to dro
2e7c0 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79  p a table if any
2e7d0 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65   cursors are ope
2e7e0 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  n on the.  ** da
2e7f0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
2e800 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d  because in auto-
2e810 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20  vacuum mode the 
2e820 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a  backend may.  **
2e830 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e   need to move an
2e840 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20  other root-page 
2e850 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65  to fill a gap le
2e860 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2e870 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65  d.  ** root page
2e880 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72  . If an open cur
2e890 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68  sor was using th
2e8a0 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65  is page a proble
2e8b0 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63  m would .  ** oc
2e8c0 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cur..  */.  if( 
2e8d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
2e8e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e8f0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20  E_LOCKED;.  }.. 
2e900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e910 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28  eeGetPage(pBt, (
2e920 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50  Pgno)iTable, &pP
2e930 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
2e940 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2e950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e960 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20  eeClearTable(p, 
2e970 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72  iTable);.  if( r
2e980 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
2e990 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e9a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e9b0 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
2e9c0 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
2e9d0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2e9e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2e9f0 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
2ea00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2ea10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ea20 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
2ea30 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2ea40 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
2ea50 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
2ea60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ea70 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
2ea80 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  , &maxRootPgno);
2ea90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2eaa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eab0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2eac0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2ead0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2eae0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54   }..      if( iT
2eaf0 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e  able==maxRootPgn
2eb00 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
2eb10 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  If the table bei
2eb20 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68  ng dropped is th
2eb30 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
2eb40 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2eb50 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
2eb60 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
2eb70 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f  base, put the ro
2eb80 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66  ot page on the f
2eb90 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ree list. .     
2eba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
2ebb0 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2ebc0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2ebd0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ebe0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ebf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ec00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2ec10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ec20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ec30 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
2ec40 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73  ing dropped does
2ec50 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61   not have the la
2ec60 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2ec70 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2ec80 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2ec90 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70  e. So move the p
2eca0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e  age that does in
2ecb0 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
2ecc0 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74  ** gap left by t
2ecd0 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d  he deleted root-
2ece0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
2ecf0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
2ed00 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20   *pMove;.       
2ed10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ed20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ge);.        rc 
2ed30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2ed40 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
2ed50 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
2ed60 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2ed70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ed80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2ed90 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2eda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
2edb0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
2edc0 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Move, PTRMAP_ROO
2edd0 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65  TPAGE, 0, iTable
2ede0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2edf0 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2ee00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2ee10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ee20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ee30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ee50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ee60 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
2ee70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
2ee80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2eea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eeb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2eec0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
2eed0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2eee0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
2eef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ef00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ef10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2ef20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ef30 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
2ef40 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2ef50 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
2ef60 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
2ef70 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
2ef80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2ef90 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
2efa0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
2efb0 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
2efc0 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
2efd0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
2efe0 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
2eff0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2f000 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
2f010 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
2f020 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
2f030 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
2f040 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
2f050 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2f060 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2f070 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2f080 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2f090 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2f0a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f0b0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2f0c0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2f0d0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
2f0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2f0f0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2f100 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2f110 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
2f120 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f130 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
2f140 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f150 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2f160 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
2f170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f180 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2f190 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
2f1a0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2f1b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2f1c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2f1d0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2f1e0 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
2f1f0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2f200 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2f210 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
2f220 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
2f230 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2f240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f250 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  c;  .}.int sqlit
2f260 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2f270 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2f280 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
2f290 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2f2a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2f2b0 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
2f2c0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
2f2d0 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61  rc = btreeDropTa
2f2e0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ble(p, iTable, p
2f2f0 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74  iMoved);.  sqlit
2f300 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2f310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f320 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
2f330 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2f340 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
2f350 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
2f360 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
2f370 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
2f380 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
2f390 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
2f3a0 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
2f3b0 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
2f3c0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
2f3d0 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
2f3e0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2f3f0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
2f400 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
2f410 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
2f420 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
2f430 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
2f440 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
2f450 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
2f460 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
2f470 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
2f480 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
2f490 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
2f4a0 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
2f4b0 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
2f4c0 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
2f4d0 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
2f4e0 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
2f4f0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2f500 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
2f510 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
2f520 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2f530 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  e;.  int rc;.  u
2f540 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2f550 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
2f560 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2f570 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f580 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
2f590 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  = p->db;..  /* R
2f5a0 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61  eading a meta-da
2f5b0 74 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65  ta value require
2f5c0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
2f5d0 20 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e   page 1 (and hen
2f5e0 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  ce.  ** the sqli
2f5f0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
2f600 20 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f   We grab this lo
2f610 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ck regardless of
2f620 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a   whether or.  **
2f630 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f   not the SQLITE_
2f640 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
2f650 66 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65  flag is set (the
2f660 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2f670 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20   page.  ** 1 is 
2f680 74 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65  treated as a spe
2f690 63 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65  cial case by que
2f6a0 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e  ryTableLock() an
2f6b0 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a  d lockTable())..
2f6c0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72    */.  rc = quer
2f6d0 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c  yTableLock(p, 1,
2f6e0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
2f6f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
2f710 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2f720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2f730 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2f740 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
2f750 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2f760 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
2f770 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
2f780 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2f790 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
2f7a0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
2f7b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
2f7c0 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
2f7d0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
2f7e0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
2f7f0 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65  );.  *pMeta = ge
2f800 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2f810 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69   idx*4]);.  sqli
2f820 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
2f830 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  bPage);..  /* If
2f840 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73   autovacuumed is
2f850 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69   disabled in thi
2f860 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61  s build but we a
2f870 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20  re trying to .  
2f880 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74  ** access an aut
2f890 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61  ovacuumed databa
2f8a0 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68  se, then make th
2f8b0 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f  e database reado
2f8c0 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65  nly. .  */.#ifde
2f8d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f8e0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69  TOVACUUM.  if( i
2f8f0 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e  dx==4 && *pMeta>
2f900 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  0 ) pBt->readOnl
2f910 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20  y = 1;.#endif.. 
2f920 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61   /* Grab the rea
2f930 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
2f940 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b  . */.  rc = lock
2f950 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44  Table(p, 1, READ
2f960 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65  _LOCK);.  sqlite
2f970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2f980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f990 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61  /*.** Write meta
2f9a0 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63  -information bac
2f9b0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
2f9c0 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73  ase.  Meta[0] is
2f9d0 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  .** read-only an
2f9e0 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69  d may not be wri
2f9f0 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tten..*/.int sql
2fa00 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2fa10 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
2fa20 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61  t idx, u32 iMeta
2fa30 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2fa40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
2fa50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2fa60 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
2fa70 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26  ssert( idx>=1 &&
2fa80 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71   idx<=15 );.  sq
2fa90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2faa0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
2fab0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
2fac0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2fad0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
2fae0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2faf0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2fb00 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2fb10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2fb20 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
2fb30 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20  1!=0 );.    pP1 
2fb40 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
2fb50 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73  Data;.    rc = s
2fb60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fb70 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2fb80 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2fb90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fba0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2fbb0 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2fbc0 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65  , iMeta);.#ifnde
2fbd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2fbe0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2fbf0 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20  f( idx==7 ){.   
2fc00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2fc10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20  ->autoVacuum || 
2fc20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  iMeta==0 );.    
2fc30 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74      assert( iMet
2fc40 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31  a==0 || iMeta==1
2fc50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2fc60 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 4d  >incrVacuum = iM
2fc70 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eta;.      }.#en
2fc80 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
2fc90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2fca0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2fcb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2fcc0 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
2fcd0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2fce0 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
2fcf0 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
2fd00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2fd10 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
2fd20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
2fd30 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
2fd40 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2fd50 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
2fd60 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
2fd70 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
2fd80 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
2fd90 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
2fda0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68  rsorPosition() h
2fdb0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50  ere..  */.  MemP
2fdc0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65  age *pPage;.  re
2fdd0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2fde0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2fdf0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2fe00 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2fe10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2fe20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2fe30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
2fe40 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a  t==pCur->pBt );.
2fe50 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f    return pPage ?
2fe60 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50   pPage->aData[pP
2fe70 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20  age->hdrOffset] 
2fe80 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  : 0;.}.../*.** R
2fe90 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
2fea0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2feb0 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
2fec0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2fed0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2fee0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2fef0 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
2ff00 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
2ff10 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
2ff20 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
2ff30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2ff40 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2ff50 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
2ff60 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20  ppend a message 
2ff70 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
2ff80 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  sage string..*/.
2ff90 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
2ffa0 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e  kAppendMsg(.  In
2ffb0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2ffc0 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31  k,.  char *zMsg1
2ffd0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2ffe0 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
2fff0 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
30000 20 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20    char *zMsg2;. 
30010 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78   if( !pCheck->mx
30020 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
30030 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b  pCheck->mxErr--;
30040 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b  .  pCheck->nErr+
30050 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  +;.  va_start(ap
30060 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
30070 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  sg2 = sqlite3VMP
30080 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72 6d 61 74  rintf(0, zFormat
30090 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
300a0 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31  ap);.  if( zMsg1
300b0 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22  ==0 ) zMsg1 = ""
300c0 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
300d0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63  zErrMsg ){.    c
300e0 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65  har *zOld = pChe
300f0 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20  ck->zErrMsg;.   
30100 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
30110 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
30120 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
30130 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c  ck->zErrMsg, zOl
30140 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20  d, "\n", zMsg1, 
30150 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
30160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
30170 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  ee(zOld);.  }els
30180 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
30190 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
301a0 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  >zErrMsg, zMsg1,
301b0 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
301c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
301d0 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a  _free(zMsg2);.}.
301e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
301f0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30200 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
30210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
30220 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
30230 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65  .** Add 1 to the
30240 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
30250 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e   for page iPage.
30260 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
30270 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72   second.** refer
30280 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
30290 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
302a0 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b  essage to pCheck
302b0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65  ->zErrMsg..** Re
302c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
302d0 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72  are 2 ore more r
302e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
302f0 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a   page and 0 if.*
30300 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
30310 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65   first reference
30320 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   to the page..**
30330 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  .** Also check t
30340 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
30350 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73  ber is in bounds
30360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30370 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69  checkRef(Integri
30380 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e  tyCk *pCheck, in
30390 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a  t iPage, char *z
303a0 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20  Context){.  if( 
303b0 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
303c0 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65  n 1;.  if( iPage
303d0 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c  >pCheck->nPage |
303e0 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20  | iPage<0 ){.   
303f0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30400 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30410 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20  , "invalid page 
30420 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67  number %d", iPag
30430 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
30440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65  ;.  }.  if( pChe
30450 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
30460 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ==1 ){.    check
30470 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30480 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64  , zContext, "2nd
30490 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
304a0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
304b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
304c0 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68  }.  return  (pCh
304d0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
304e0 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64  ]++)>1;.}..#ifnd
304f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30500 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
30510 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65  Check that the e
30520 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
30530 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65  ter-map for page
30540 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20   iChild maps to 
30550 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74  .** page iParent
30560 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70  , pointer type p
30570 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20  trType. If not, 
30580 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20  append an error 
30590 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43  message.** to pC
305a0 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
305b0 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70  void checkPtrmap
305c0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
305d0 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e  *pCheck,   /* In
305e0 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f  tegrity check co
305f0 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  ntext */.  Pgno 
30600 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20  iChild,         
30610 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20    /* Child page 
30620 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
30630 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
30640 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
30650 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20  ointer map type 
30660 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e  */.  Pgno iParen
30670 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  t,          /* E
30680 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
30690 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20  map parent page 
306a0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
306b0 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
306c0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65     /* Context de
306d0 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20  scription (used 
306e0 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a  for error msg) *
306f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
30700 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b   u8 ePtrmapType;
30710 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50  .  Pgno iPtrmapP
30720 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70  arent;..  rc = p
30730 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d  trmapGet(pCheck-
30740 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65  >pBt, iChild, &e
30750 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74  PtrmapType, &iPt
30760 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  rmapParent);.  i
30770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30780 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
30790 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
307a0 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
307b0 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
307c0 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
307d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
307e0 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
307f0 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
30800 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
30810 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
30820 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30830 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
30840 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
30850 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
30860 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
30870 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
30880 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
30890 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
308a0 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
308b0 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
308c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
308d0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
308e0 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
308f0 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
30900 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
30910 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
30920 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
30930 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
30940 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
30950 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
30960 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
30970 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
30980 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
30990 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
309a0 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
309b0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
309c0 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
309d0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
309e0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
309f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
30a00 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
30a10 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
30a20 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
30a30 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
30a40 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
30a50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
30a60 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
30a70 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
30a80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
30a90 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
30aa0 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
30ab0 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
30ac0 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
30ad0 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
30ae0 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
30af0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
30b00 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
30b10 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75  pOvflPage;.    u
30b20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
30b30 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28  vflData;.    if(
30b40 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20   iPage<1 ){.    
30b50 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30b60 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30b70 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20  t,.         "%d 
30b80 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73  of %d pages miss
30b90 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f  ing from overflo
30ba0 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  w list starting 
30bb0 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  at %d",.        
30bc0 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c    N+1, expected,
30bd0 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
30be0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30bf0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
30c00 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f  heck, iPage, zCo
30c10 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a  ntext) ) break;.
30c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
30c30 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e  agerGet(pCheck->
30c40 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50  pPager, (Pgno)iP
30c50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29  age, &pOvflPage)
30c60 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
30c70 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30c80 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c   zContext, "fail
30c90 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25  ed to get page %
30ca0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30cb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30cc0 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28     pOvflData = (
30cd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
30ce0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
30cf0 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ata(pOvflPage);.
30d00 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
30d10 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
30d20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
30d30 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66  vflData[4]);.#if
30d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30d50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30d60 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30d70 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
30d80 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
30d90 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61  rmap(pCheck, iPa
30da0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
30db0 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
30dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
30dd0 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43  f.      if( n>pC
30de0 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  heck->pBt->usabl
30df0 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20  eSize/4-8 ){.   
30e00 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30e10 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30e20 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
30e30 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20   "freelist leaf 
30e40 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e  count too big on
30e50 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
30e60 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a  );.        N--;.
30e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30e80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30e90 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
30ea0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67     Pgno iFreePag
30eb0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  e = get4byte(&pO
30ec0 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  vflData[8+i*4]);
30ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30ee0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30ef0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30f00 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
30f10 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
30f20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
30f30 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
30f40 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
30f50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
30f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
30f70 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
30f80 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
30f90 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e   iFreePage, zCon
30fa0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  text);.        }
30fb0 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b  .        N -= n;
30fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
30fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30fe0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30ff0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
31000 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
31010 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31020 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65  vacuum and iPage
31030 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
31040 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69  .      ** page i
31050 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  n this overflow 
31060 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74  list, check that
31070 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31080 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20   entry for.     
31090 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
310a0 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69  g page matches i
310b0 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Page..      */. 
310c0 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
310d0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
310e0 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20   && N>0 ){.     
310f0 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28     i = get4byte(
31100 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
31110 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31120 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41  pCheck, i, PTRMA
31130 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61  P_OVERFLOW2, iPa
31140 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
31160 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20  dif.    iPage = 
31170 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
31180 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
31190 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
311a0 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Page);.  }.}.#en
311b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
311c0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
311d0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
311e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
311f0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
31200 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69   Do various sani
31210 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73  ty checks on a s
31220 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20  ingle page of a 
31230 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tree.  Return.**
31240 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e   the tree depth.
31250 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74    Root pages ret
31260 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20  urn 0.  Parents 
31270 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a  of root pages.**
31280 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73   return 1, and s
31290 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  o forth..** .** 
312a0 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65  These checks are
312b0 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   done:.**.**    
312c0 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    1.  Make sure 
312d0 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66  that cells and f
312e0 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74  reeblocks do not
312f0 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20   overlap.**     
31300 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65       but combine
31310 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63   to completely c
31320 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a  over the page..*
31330 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20  *  NO  2.  Make 
31340 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61  sure cell keys a
31350 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20  re in order..** 
31360 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75   NO  3.  Make su
31370 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73  re no key is les
31380 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
31390 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a  to zLowerBound..
313a0 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65  **  NO  4.  Make
313b0 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
313c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
313d0 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42  equal to zUpperB
313e0 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e  ound..**      5.
313f0 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65    Check the inte
31400 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f  grity of overflo
31410 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20  w pages..**     
31420 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79   6.  Recursively
31430 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50   call checkTreeP
31440 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64  age on all child
31450 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20  ren..**      7. 
31460 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
31470 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68   depth of all ch
31480 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61  ildren is the sa
31490 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20  me..**      8.  
314a0 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70  Make sure this p
314b0 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  age is at least 
314c0 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65  33% full or else
314d0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20   it is.**       
314e0 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74     the root of t
314f0 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  he tree..*/.stat
31500 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65  ic int checkTree
31510 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74  Page(.  Integrit
31520 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
31530 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   Context for the
31540 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f   sanity check */
31550 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
31560 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31570 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
31580 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  age to check */.
31590 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
315a0 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
315b0 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72  t page */.  char
315c0 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74   *zParentContext
315d0 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74    /* Parent cont
315e0 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ext */.){.  MemP
315f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
31600 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20  t i, rc, depth, 
31610 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20  d2, pgno, cnt;. 
31620 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74   int hdr, cellSt
31630 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  art;.  int nCell
31640 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
31650 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
31660 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
31670 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74  .  char zContext
31680 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68  [100];.  char *h
31690 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  it;..  sqlite3_s
316a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
316b0 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
316c0 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c  xt, "Page %d: ",
316d0 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43   iPage);..  /* C
316e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
316f0 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20  ge exists.  */. 
31700 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70   pBt = pCheck->p
31710 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  Bt;.  usableSize
31720 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
31730 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  ze;.  if( iPage=
31740 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
31750 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
31760 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61  heck, iPage, zPa
31770 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72  rentContext) ) r
31780 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
31790 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
317a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
317b0 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
317c0 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
317d0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
317e0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
317f0 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  ,.       "unable
31800 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
31810 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
31820 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  , rc);.    retur
31830 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
31840 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31850 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
31860 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b   pParent))!=0 ){
31870 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31880 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31890 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
318a0 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 69 74            "sqlit
318b0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
318c0 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20  ) returns error 
318d0 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20  code %d", rc);. 
318e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
318f0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
31900 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n 0;.  }..  /* C
31910 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65  heck out all the
31920 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64   cells..  */.  d
31930 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28  epth = 0;.  for(
31940 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
31950 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  ell && pCheck->m
31960 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xErr; i++){.    
31970 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69  u8 *pCell;.    i
31980 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49  nt sz;.    CellI
31990 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f  nfo info;..    /
319a0 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20  * Check payload 
319b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
319c0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
319d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
319e0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
319f0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
31a00 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67      "On tree pag
31a10 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c  e %d cell %d: ",
31a20 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   iPage, i);.    
31a30 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31a40 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73  (pPage,i);.    s
31a50 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
31a60 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
31a70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
31a80 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74    sz = info.nDat
31a90 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  a;.    if( !pPag
31aa0 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b  e->intKey ) sz +
31ab0 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  = info.nKey;.   
31ac0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66   assert( sz==inf
31ad0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
31ae0 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
31af0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
31b00 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
31b10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
31b20 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
31b30 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
31b40 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
31b50 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
31b60 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
31b70 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
31b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31b90 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
31ba0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31bc0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31bd0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
31be0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
31bf0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31c00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31c10 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
31c20 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
31c30 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
31c40 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
31c50 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
31c60 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
31c70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
31c80 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31c90 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
31ca0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
31cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31cc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31cd0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
31ce0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31cf0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31d00 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
31d10 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
31d20 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31d30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31d40 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
31d50 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e  ePage(pCheck,pgn
31d60 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74  o,pPage,zContext
31d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  );.      if( i>0
31d80 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b   && d2!=depth ){
31d90 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31da0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31db0 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64  zContext, "Child
31dc0 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66   page depth diff
31dd0 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers");.      }. 
31de0 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b       depth = d2;
31df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
31e00 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31e10 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
31e20 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
31e30 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31e40 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c  set+8]);.    sql
31e50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
31e60 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
31e70 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e90 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72  "On page %d at r
31ea0 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69  ight child: ", i
31eb0 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
31ec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31ed0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
31ee0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31ef0 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
31f00 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
31f10 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
31f20 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Page, 0);.    }.
31f30 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
31f40 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
31f50 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43   pgno, pPage, zC
31f60 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20  ontext);.  }. . 
31f70 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
31f80 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20  mplete coverage 
31f90 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f  of the page.  */
31fa0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
31fb0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
31fc0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31fd0 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65  ;.  hit = sqlite
31fe0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 75 73 61  3MallocZero( usa
31ff0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
32000 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
32010 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
32020 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32030 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
32040 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32050 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
32060 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
32070 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
32080 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
32090 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
320a0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
320b0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
320c0 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
320d0 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 63 65     u16 size = ce
320e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
320f0 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
32100 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
32110 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
32120 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
32130 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
32140 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32150 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
32160 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
32170 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
32180 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
32190 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
321a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
321b0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
321c0 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
321d0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
321e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
321f0 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
32200 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
32210 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
32220 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
32230 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
32240 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
32250 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
32260 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
32270 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
32280 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
32290 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
322a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
322b0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
322c0 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
322d0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
322e0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
322f0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
32300 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
32310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32320 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
32330 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
32340 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
32350 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
32360 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
32370 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
32380 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
32390 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
323a0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
323b0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
323c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
323d0 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
323e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
323f0 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
32400 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
32410 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
32420 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
32430 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32450 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
32460 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
32470 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32480 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32490 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
324a0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
324b0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
324c0 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
324d0 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
324e0 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
324f0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
32500 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
32510 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
32520 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
32530 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
32540 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
32550 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32560 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
32570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32580 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32590 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
325a0 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
325b0 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
325c0 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
325d0 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
325e0 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
325f0 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
32600 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
32610 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
32620 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
32630 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
32640 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
32650 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
32660 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
32670 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68  g checks out, th
32680 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
32690 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d  ns NULL.  If som
326a0 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69  ething is.** ami
326b0 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ss, an error mes
326c0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
326d0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
326e0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
326f0 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e  ().** and a poin
32700 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f  ter to that erro
32710 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74  r message is ret
32720 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c  urned.  The call
32730 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
32740 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
32750 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
32760 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
32770 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  n it is done..*/
32780 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74  .char *sqlite3Bt
32790 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
327a0 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  k(.  Btree *p,  
327b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
327c0 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
327d0 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20  .  int *aRoot,  
327e0 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
327f0 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
32800 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61  rs for individua
32810 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74  l trees */.  int
32820 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75   nRoot,    /* Nu
32830 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32840 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20  in aRoot[] */.  
32850 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a  int mxErr,    /*
32860 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20   Stop reporting 
32870 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69  errors after thi
32880 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  s many */.  int 
32890 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69  *pnErr    /* Wri
328a0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  te number of err
328b0 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73  ors seen to this
328c0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a   variable */.){.
328d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
328e0 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79  Ref;.  Integrity
328f0 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53  Ck sCheck;.  BtS
32900 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32910 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
32920 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
32930 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
32940 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  .  nRef = sqlite
32950 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
32960 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
32970 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  f( lockBtreeWith
32980 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45  Retry(p)!=SQLITE
32990 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
329a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
329b0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
329c0 74 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c  te3StrDup("Unabl
329d0 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72  e to acquire a r
329e0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
329f0 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
32a00 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
32a10 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
32a20 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
32a30 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
32a40 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
32a50 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b  Pagecount(sCheck
32a60 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65  .pPager);.  sChe
32a70 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72  ck.mxErr = mxErr
32a80 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20  ;.  sCheck.nErr 
32a90 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
32aa0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
32ab0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32ac0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  M.  if( pBt->nTr
32ad0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43  unc!=0 ){.    sC
32ae0 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74  heck.nPage = pBt
32af0 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65  ->nTrunc;.  }.#e
32b00 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63  ndif.  if( sChec
32b10 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  k.nPage==0 ){.  
32b20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
32b30 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
32b40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
32b50 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
32b60 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b   0;.  }.  sCheck
32b70 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  .anRef = sqlite3
32b80 5f 6d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b  _malloc( (sCheck
32b90 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
32ba0 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
32bb0 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65  ) );.  if( !sChe
32bc0 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20  ck.anRef ){.    
32bd0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
32be0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  sed(pBt);.    *p
32bf0 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71  nErr = 1;.    sq
32c00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
32c10 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
32c20 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 2d  qlite3MPrintf(p-
32c30 3e 64 62 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  >db, "Unable to 
32c40 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22  malloc %d bytes"
32c50 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65  , .        (sChe
32c60 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
32c70 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
32c80 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  0]));.  }.  for(
32c90 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
32ca0 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
32cb0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
32cc0 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
32cd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
32ce0 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
32cf0 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
32d00 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
32d10 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  1;.  }.  sCheck.
32d20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
32d30 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  /* Check the int
32d40 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
32d50 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68  eelist.  */.  ch
32d60 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c  eckList(&sCheck,
32d70 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42   1, get4byte(&pB
32d80 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
32d90 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  [32]),.         
32da0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74     get4byte(&pBt
32db0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
32dc0 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65  36]), "Main free
32dd0 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20  list: ");..  /* 
32de0 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61  Check all the ta
32df0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
32e00 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26  (i=0; i<nRoot &&
32e10 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
32e20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f  ++){.    if( aRo
32e30 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  ot[i]==0 ) conti
32e40 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
32e50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32e60 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
32e70 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61  >autoVacuum && a
32e80 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20  Root[i]>1 ){.   
32e90 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26     checkPtrmap(&
32ea0 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
32eb0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
32ec0 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E, 0, 0);.    }.
32ed0 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
32ee0 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b  TreePage(&sCheck
32ef0 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22  , aRoot[i], 0, "
32f00 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f  List of tree roo
32f10 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ts: ");.  }..  /
32f20 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
32f30 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  y page in the fi
32f40 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  le is referenced
32f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
32f60 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
32f70 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
32f80 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53  ; i++){.#ifdef S
32f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32fa0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43  ACUUM.    if( sC
32fb0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
32fc0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
32fd0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
32fe0 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
32ff0 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
33000 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
33010 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
33020 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
33030 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20  to-vacuum, make 
33040 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63  sure no tables c
33050 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65  ontain.    ** re
33060 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e  ferences to poin
33070 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20  ter-map pages.. 
33080 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43     */.    if( sC
33090 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
330a0 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
330b0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
330c0 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61  i)!=i || !pBt->a
330d0 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
330e0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
330f0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
33100 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
33110 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
33120 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  }.    if( sCheck
33130 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20  .anRef[i]!=0 && 
33140 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
33150 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d  PAGENO(pBt, i)==
33160 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61  i && pBt->autoVa
33170 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
33180 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33190 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74  Check, 0, "Point
331a0 65 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69  er map page %d i
331b0 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69  s referenced", i
331c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
331d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
331e0 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ure this analysi
331f0 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20  s did not leave 
33200 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65  any unref() page
33210 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42  s.  */.  unlockB
33220 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
33230 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d  );.  if( nRef !=
33240 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
33250 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
33260 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  r) ){.    checkA
33270 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
33280 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74  , 0, .      "Out
33290 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f  standing page co
332a0 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64  unt goes from %d
332b0 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68   to %d during th
332c0 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20  is analysis",.  
332d0 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65      nRef, sqlite
332e0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
332f0 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20  Bt->pPager).    
33300 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  );.  }..  /* Cle
33310 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72  an  up and repor
33320 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  t errors..  */. 
33330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
33340 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ve(p);.  sqlite3
33350 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52  _free(sCheck.anR
33360 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  ef);.  *pnErr = 
33370 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72  sCheck.nErr;.  r
33380 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72  eturn sCheck.zEr
33390 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rMsg;.}.#endif /
333a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
333b0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
333c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
333d0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
333e0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
333f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
33400 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
33410 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  r filename is in
33420 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20  variant as long 
33430 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a  as the pager is.
33440 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73  ** open so it is
33450 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20   safe to access 
33460 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68  without the BtSh
33470 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63  ared mutex..*/.c
33480 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33490 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
334a0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
334b0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
334c0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
334d0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
334e0 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42  erFilename(p->pB
334f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
33500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33510 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
33520 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
33530 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
33540 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
33550 20 54 68 65 20 70 61 67 65 72 20 64 69 72 65 63   The pager direc
33560 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76  tory name is inv
33570 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33580 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33590 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
335a0 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
335b0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
335c0 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
335d0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
335e0 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65  3BtreeGetDirname
335f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
33600 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
33610 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
33620 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
33630 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  Dirname(p->pBt->
33640 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
33650 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
33660 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
33670 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68  rnal file for th
33680 69 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  is database. The
33690 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
336a0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
336b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67   is the same reg
336c0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
336d0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
336e0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
336f0 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a  created or not..
33700 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
33710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
33720 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73   is invariant as
33730 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67   long as the pag
33740 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f  er is.** open so
33750 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61   it is safe to a
33760 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68  ccess without th
33770 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78  e BtShared mutex
33780 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
33790 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
337a0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65  Journalname(Btre
337b0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
337c0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
337d0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
337e0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
337f0 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  alname(p->pBt->p
33800 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64  Pager);.}..#ifnd
33810 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
33820 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  ACUUM./*.** Copy
33830 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
33840 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d  ntent of pBtFrom
33850 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20   into pBtTo.  A 
33860 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
33870 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f  ust be active fo
33880 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a  r both files..**
33890 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
338a0 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65 20  file pTo may be 
338b0 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20  reduced by this 
338c0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66  operation..** If
338d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
338e0 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61  rong, the transa
338f0 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20  ction on pTo is 
33900 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a 2a  rolled back. .**
33910 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
33920 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  l, CommitPhaseOn
33930 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  e() may be calle
33940 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72 65 20  d on pTo before 
33950 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54  returning. .** T
33960 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
33970 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74 69   finish committi
33980 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
33990 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63 61 6c  on on pTo by cal
339a0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 42  ling.** sqlite3B
339b0 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f  treeCommit()..*/
339c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
339d0 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20  eCopyFile(Btree 
339e0 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72  *pTo, Btree *pFr
339f0 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  om){.  int rc = 
33a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e  SQLITE_OK;.  Pgn
33a10 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46 72  o i;..  Pgno nFr
33a20 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 4e  omPage;     /* N
33a30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
33a40 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e  n pFrom */.  Pgn
33a50 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20 20 20  o nToPage;      
33a60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
33a70 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20  ges in pTo */.  
33a80 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b 20 20  Pgno nNewPage;  
33a90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33aa0 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 61 66   pages in pTo af
33ab0 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a  ter the copy */.
33ac0 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b 20 20  .  Pgno iSkip;  
33ad0 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
33ae0 67 20 62 79 74 65 20 70 61 67 65 20 69 6e 20 70  g byte page in p
33af0 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 50  To */.  int nToP
33b00 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 50  ageSize;    /* P
33b10 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54 6f 20  age size of pTo 
33b20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
33b30 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b  t nFromPageSize;
33b40 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f    /* Page size o
33b50 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74 65 73  f pFrom in bytes
33b60 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65 64 20   */..  BtShared 
33b70 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42  *pBtTo = pTo->pB
33b80 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  t;.  BtShared *p
33b90 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e  BtFrom = pFrom->
33ba0 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e 64 62  pBt;.  pBtTo->db
33bb0 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 70 42   = pTo->db;.  pB
33bc0 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46 72 6f  tFrom->db = pFro
33bd0 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50 61 67  m->db;..  nToPag
33be0 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d 3e 70  eSize = pBtTo->p
33bf0 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d  ageSize;.  nFrom
33c00 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 46 72  PageSize = pBtFr
33c10 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  om->pageSize;.. 
33c20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e   if( pTo->inTran
33c30 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
33c40 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73  | pFrom->inTrans
33c50 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
33c60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33c70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
33c80 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73  if( pBtTo->pCurs
33c90 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
33ca0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33cb0 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73  }..  nToPage = s
33cc0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
33cd0 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  ount(pBtTo->pPag
33ce0 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65  er);.  nFromPage
33cf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
33d00 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
33d10 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
33d20 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
33d30 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a  E_PAGE(pBtTo);..
33d40 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e    /* Variable nN
33d50 65 77 50 61 67 65 20 69 73 20 74 68 65 20 6e 75  ewPage is the nu
33d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
33d70 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
33d80 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
33d90 73 20 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67  s of pFrom using
33da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
33db0 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20  e-size of pTo.. 
33dc0 20 2a 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d   */.  nNewPage =
33dd0 20 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65   ((i64)nFromPage
33de0 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   * (i64)nFromPag
33df0 65 53 69 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f  eSize + (i64)nTo
33e00 50 61 67 65 53 69 7a 65 20 2d 20 31 29 20 2f 20  PageSize - 1) / 
33e10 0a 20 20 20 20 20 20 28 69 36 34 29 6e 54 6f 50  .      (i64)nToP
33e20 61 67 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28  ageSize;..  for(
33e30 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
33e40 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67  OK && (i<=nToPag
33e50 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65  e || i<=nNewPage
33e60 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a  ); i++){..    /*
33e70 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72 69   Journal the ori
33e80 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20  ginal page..    
33e90 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70 20  **.    ** iSkip 
33ea0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
33eb0 65 72 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  er of the lockin
33ec0 67 20 70 61 67 65 20 28 50 45 4e 44 49 4e 47 5f  g page (PENDING_
33ed0 42 59 54 45 5f 50 41 47 45 29 0a 20 20 20 20 2a  BYTE_PAGE).    *
33ee0 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 2a 70  * in database *p
33ef0 54 6f 20 28 62 65 66 6f 72 65 20 74 68 65 20 63  To (before the c
33f00 6f 70 79 29 2e 20 54 68 69 73 20 70 61 67 65 20  opy). This page 
33f10 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
33f20 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68   .    ** into th
33f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
33f40 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70 20  Unless i==iSkip 
33f50 6f 72 20 74 68 65 20 70 61 67 65 20 77 61 73 20  or the page was 
33f60 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72 65 73 65  not.    ** prese
33f70 6e 74 20 69 6e 20 70 54 6f 20 62 65 66 6f 72 65  nt in pTo before
33f80 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74   the copy operat
33f90 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ion, journal pag
33fa0 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20  e i from pTo..  
33fb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 21 3d    */.    if( i!=
33fc0 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50  iSkip && i<=nToP
33fd0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50  age ){.      DbP
33fe0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
33ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34000 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e  PagerGet(pBtTo->
34010 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50  pPager, i, &pDbP
34020 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
34030 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  rc ){.        br
34040 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
34050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34060 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
34070 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34080 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
34090 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
340a0 20 69 66 28 20 69 3e 6e 46 72 6f 6d 50 61 67 65   if( i>nFromPage
340b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 59   ){.        /* Y
340c0 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77  eah.  It seems w
340d0 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e  ierd to call Don
340e0 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61  tWrite() right a
340f0 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 42 75  fter Write(). Bu
34100 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  t.        ** tha
34110 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  t is because the
34120 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20   names of those 
34130 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f  procedures do no
34140 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20  t exactly .     
34150 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20     ** represent 
34160 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57  what they do.  W
34170 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65  rite() really me
34180 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61  ans "put this pa
34190 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ge in the.      
341a0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
341b0 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69  urnal and mark i
341c0 74 20 61 73 20 64 69 72 74 79 20 73 6f 20 74 68  t as dirty so th
341d0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 77 72  at it will be wr
341e0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
341f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34200 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44   file later."  D
34210 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65  ontWrite() undoe
34220 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
34230 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t of.        ** 
34240 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74  that and prevent
34250 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  s the page from 
34260 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  being written to
34270 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54   the database. T
34280 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
34290 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74  ge is still on t
342a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
342b0 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e  nal, though.  An
342c0 64 20 74 68 61 74 20 69 73 20 74 68 65 20 0a 20  d that is the . 
342d0 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20         ** whole 
342e0 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62 6c  point of this bl
342f0 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67 65  ock: to put page
34300 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s on the rollbac
34310 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  k journal. .    
34320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
34330 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
34340 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
34350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
34360 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34370 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 0a  DbPage);.    }..
34380 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
34390 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61 67   the data in pag
343a0 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67 65  e i of the targe
343b0 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
343c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
343d0 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20  _OK && i!=iSkip 
343e0 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29  && i<=nNewPage )
343f0 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65 20  {..      DbPage 
34400 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20  *pToPage = 0;.  
34410 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
34420 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72  4 iOff;..      r
34430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34440 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
34450 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b  r, i, &pToPage);
34460 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
34470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34490 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50 61  PagerWrite(pToPa
344a0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ge);.      }..  
344b0 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20      for(.       
344c0 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50   iOff=(i-1)*nToP
344d0 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
344e0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
344f0 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67  && iOff<i*nToPag
34500 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20  eSize; .        
34510 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67  iOff += nFromPag
34520 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20  eSize.      ){. 
34530 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
34540 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  FromPage = 0;.  
34550 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d        Pgno iFrom
34560 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61   = (iOff/nFromPa
34570 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20  geSize)+1;..    
34580 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50      if( iFrom==P
34590 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
345a0 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20  (pBtFrom) ){.   
345b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
345c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
345d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
345e0 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d  PagerGet(pBtFrom
345f0 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c  ->pPager, iFrom,
34600 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20   &pFromPage);.  
34610 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34630 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d       char *zTo =
34640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34650 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20  Data(pToPage);. 
34660 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
34670 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61  From = sqlite3Pa
34680 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d  gerGetData(pFrom
34690 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
346a0 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20   int nCopy;..   
346b0 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d         if( nFrom
346c0 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67  PageSize>=nToPag
346d0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
346e0 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28       zFrom += ((
346f0 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
34700 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46   - ((iFrom-1)*nF
34710 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20  romPageSize));. 
34720 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
34730 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a   = nToPageSize;.
34740 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
34750 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
34760 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a   += (((iFrom-1)*
34770 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d  nFromPageSize) -
34780 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69   (i-1)*nToPageSi
34790 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
347a0 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61   nCopy = nFromPa
347b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
347c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d    }..          m
347d0 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d  emcpy(zTo, zFrom
347e0 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c  , nCopy);..  sql
347f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34800 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
34810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
34820 20 20 20 20 69 66 28 20 70 54 6f 50 61 67 65 20      if( pToPage 
34830 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
34840 72 65 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ref(pToPage);.  
34850 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
34860 20 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72   things have wor
34870 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20  ked so far, the 
34880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
34890 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20  y need to be .  
348a0 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  ** truncated. Th
348b0 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69  e complex part i
348c0 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65  s that it may ne
348d0 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74  ed to be truncat
348e0 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a  ed to.  ** a siz
348f0 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e  e that is not an
34900 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
34910 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65  e of nToPageSize
34920 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20   - the current. 
34930 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73   ** page size us
34940 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ed by the pager 
34950 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34960 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a  B-Tree pTo..  **
34970 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  .  ** For exampl
34980 65 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d  e, say the page-
34990 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32  size of pTo is 2
349a0 30 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68  048 bytes and th
349b0 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a  e original .  **
349c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
349d0 20 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c   is 5 (10 KB fil
349e0 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73  e). If pFrom has
349f0 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20   a page size of 
34a00 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73  1024 .  ** bytes
34a10 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68   and 9 pages, th
34a20 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64  en the file need
34a30 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  s to be truncate
34a40 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20  d to 9KB..  */. 
34a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34a60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46  OK ){.    if( nF
34a70 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f  romPageSize!=nTo
34a80 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
34a90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
34aa0 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
34ab0 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e  agerFile(pBtTo->
34ac0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
34ad0 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29  64 iSize = (i64)
34ae0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20  nFromPageSize * 
34af0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a  (i64)nFromPage;.
34b00 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d        i64 iNow =
34b10 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e   (i64)((nToPage>
34b20 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67  nNewPage)?nToPag
34b30 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69  e:nNewPage) * (i
34b40 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  64)nToPageSize; 
34b50 0a 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64  .      i64 iPend
34b60 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44  ing = ((i64)PEND
34b70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
34b80 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54  tTo)-1) *(i64)nT
34b90 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20  oPageSize;.  .  
34ba0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a      assert( iSiz
34bb0 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20  e<=iNow );.  .  
34bc0 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68      /* Commit ph
34bd0 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68  ase one syncs th
34be0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
34bf0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
34c00 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  To .      ** con
34c10 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67  taining the orig
34c20 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f  inal data. It do
34c30 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  es not sync the 
34c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
34c50 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41      ** itself. A
34c60 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20  fter doing this 
34c70 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
34c80 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61  e OsTruncate() a
34c90 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  nd other.      *
34ca0 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74  * file APIs on t
34cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34cc0 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20   directly..     
34cd0 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   */.      pBtTo-
34ce0 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
34cf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34d00 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
34d10 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  eOne(pBtTo->pPag
34d20 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  er, 0, 0, 1);.  
34d30 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e      if( iSize<iN
34d40 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ow && rc==SQLITE
34d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
34d60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
34d70 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69  ncate(pFile, iSi
34d80 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  ze);.      }.  .
34d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
34da0 70 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61  p that copied da
34db0 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
34dc0 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69   pFrom to pTo di
34dd0 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70  d not.      ** p
34de0 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b  opulate the lock
34df0 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61  ing page of data
34e00 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65  base pTo. If the
34e10 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20   page-size of.  
34e20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20      ** pFrom is 
34e30 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61  smaller than tha
34e40 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d  t of pTo, this m
34e50 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77  eans some data w
34e60 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  ill.      ** not
34e70 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65   have been copie
34e80 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
34e90 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b     ** This block
34ea0 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73   copies the miss
34eb0 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61  ing data from da
34ec0 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20  tabase pFrom to 
34ed0 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73  pTo .      ** us
34ee0 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54  ing file APIs. T
34ef0 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
34f00 75 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  use at this poin
34f10 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20  t we know that. 
34f20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74       ** all of t
34f30 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
34f40 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65   from pTo has be
34f50 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  en synced into t
34f60 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
34f70 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68  rnal file. At th
34f80 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c  is point it woul
34f90 64 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20  d be safe to do 
34fa0 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20  anything at.    
34fb0 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20    ** all to the 
34fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78  database file ex
34fd0 63 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74  cept truncate it
34fe0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a   to zero bytes..
34ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
35000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35010 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   && nFromPageSiz
35020 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26  e<nToPageSize &&
35030 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29   iSize>iPending)
35040 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  {.        i64 iO
35050 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ff;.        for(
35060 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d  .          iOff=
35070 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20  iPending; .     
35080 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
35090 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e  OK && iOff<(iPen
350a0 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65  ding+nToPageSize
350b0 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ); .          iO
350c0 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
350d0 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ize.        ){. 
350e0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
350f0 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
35100 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
35110 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
35120 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20  omPageSize)+1;. 
35130 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
35140 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42  iFrom==PENDING_B
35150 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d  YTE_PAGE(pBtFrom
35160 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d  ) || iFrom>nFrom
35170 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
35180 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
35190 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
351a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
351b0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
351c0 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
351d0 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
351e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
351f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35200 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
35210 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
35220 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
35230 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09 20 20 72  romPage);.  .  r
35240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
35250 74 65 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c  te(pFile, zFrom,
35260 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20   nFromPageSize, 
35270 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  iOff);.         
35280 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35290 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b  nref(pFromPage);
352a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
352b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
352c0 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20   .      /* Sync 
352d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
352e0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  e */.      if( r
352f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35300 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35310 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 42  ite3PagerSync(pB
35320 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
35330 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
35340 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
35350 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
35360 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
35370 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20 20 20 7d  nNewPage);.    }
35380 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
353a0 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46  pBtTo->pageSizeF
353b0 69 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ixed = 0;.    }.
353c0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
353d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
353e0 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a  eRollback(pTo);.
353f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
35400 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
35410 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42  3BtreeCopyFile(B
35420 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
35430 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
35440 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
35450 65 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20  eeEnter(pTo);.  
35460 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
35470 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d  r(pFrom);.  rc =
35480 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70   btreeCopyFile(p
35490 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71  To, pFrom);.  sq
354a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
354b0 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65  pFrom);.  sqlite
354c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29  3BtreeLeave(pTo)
354d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
354e0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
354f0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a  TE_OMIT_VACUUM *
35500 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
35510 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72  non-zero if a tr
35520 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35530 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
35540 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
35550 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  s(Btree *p){.  a
35560 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73  ssert( p==0 || s
35570 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35580 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
35590 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
355a0 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
355b0 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
355c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
355d0 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
355e0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
355f0 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
35600 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35610 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
35620 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
35630 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
35640 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
35650 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70  urn (p->pBt && p
35660 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a  ->pBt->inStmt);.
35670 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
35680 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65  non-zero if a re
35690 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72  ad (or write) tr
356a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
356b0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
356c0 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
356d0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
356e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
356f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
35700 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
35710 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
35720 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
35730 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NONE));.}../*.*
35740 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35750 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
35760 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d  r to a blob of m
35770 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35780 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c   with.** a singl
35790 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20  e shared-btree. 
357a0 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  The memory is us
357b0 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64  ed by client cod
357c0 65 20 66 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a  e for its own.**
357d0 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65   purposes (for e
357e0 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65  xample, to store
357f0 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63   a high-level sc
35800 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20  hema associated 
35810 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61  with .** the sha
35820 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20  red-btree). The 
35830 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61  btree layer mana
35840 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ges reference co
35850 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a  unting issues..*
35860 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
35870 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
35880 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62  ed on a shared-b
35890 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74  tree, nBytes byt
358a0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
358b0 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a  are allocated, z
358c0 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72  eroed, and retur
358d0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
358e0 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73  r. For each subs
358f0 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20  equent .** call 
35900 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
35910 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
35920 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
35930 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a   the same blob.*
35940 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75  * of memory retu
35950 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73  rned. .**.** Jus
35960 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61  t before the sha
35970 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f  red-btree is clo
35980 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
35990 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
359a0 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65  .** xFree argume
359b0 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f  nt when the memo
359c0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61  ry allocation wa
359d0 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65  s made is invoke
359e0 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f  d on the .** blo
359f0 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d  b of allocated m
35a00 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63  emory. This func
35a10 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
35a20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
35a30 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65  e().** on the me
35a40 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20  mory, the btree 
35a50 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e  layer does that.
35a60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
35a70 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72  3BtreeSchema(Btr
35a80 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ee *p, int nByte
35a90 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28  s, void(*xFree)(
35aa0 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68  void *)){.  BtSh
35ab0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
35ac0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
35ad0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
35ae0 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  ( !pBt->pSchema 
35af0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68  ){.    pBt->pSch
35b00 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ema = sqlite3Mal
35b10 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b  locZero(nBytes);
35b20 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
35b30 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20  chema = xFree;. 
35b40 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
35b50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
35b60 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  urn pBt->pSchema
35b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35b80 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65  n true if anothe
35b90 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61  r user of the sa
35ba0 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  me shared btree 
35bb0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  as the argument.
35bc0 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  ** handle holds 
35bd0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
35be0 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  k on the sqlite_
35bf0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f  master table..*/
35c00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35c10 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
35c20 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
35c30 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
35c40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35c50 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
35c60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
35c70 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
35c80 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28  (queryTableLock(
35c90 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
35ca0 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49  READ_LOCK)!=SQLI
35cb0 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
35cc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
35cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35cf0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
35d00 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  E./*.** Obtain a
35d10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
35d20 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
35d30 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68 65  ge is iTab.  The
35d40 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72  .** lock is a wr
35d50 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72  ite lock if isWr
35d60 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20  itelock is true 
35d70 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a  or a read lock.*
35d80 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73 65  * if it is false
35d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35da0 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42  BtreeLockTable(B
35db0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
35dc0 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  b, u8 isWriteLoc
35dd0 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
35de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c  QLITE_OK;.  u8 l
35df0 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57 72 69  ockType = (isWri
35e00 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43  teLock?WRITE_LOC
35e10 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  K:READ_LOCK);.  
35e20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
35e30 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 71 75 65  r(p);.  rc = que
35e40 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
35e50 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
35e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
35e80 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
35e90 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
35ea0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
35eb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
35ec0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
35ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35ee0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
35ef0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73  .** Argument pCs
35f00 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72 73  r must be a curs
35f10 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  or opened for wr
35f20 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20  iting on an .** 
35f30 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72  INTKEY table cur
35f40 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
35f50 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65  at a valid table
35f60 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73   entry. .** This
35f70 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69   function modifi
35f80 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  es the data stor
35f90 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
35fa0 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c  at entry..** Onl
35fb0 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65  y the data conte
35fc0 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d  nt may only be m
35fd0 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e  odified, it is n
35fe0 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  ot possible.** t
35ff0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e  o change the len
36000 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
36010 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  stored..*/.int s
36020 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
36030 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73  ta(BtCursor *pCs
36040 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
36050 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29  32 amt, void *z)
36060 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
36070 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 73  orHoldsMutex(pCs
36080 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
36090 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
360a0 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2d  ld(pCsr->pBtree-
360b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
360c0 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73   assert(pCsr->is
360d0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
360e0 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74  .  if( pCsr->eSt
360f0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
36100 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
36110 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d  f( pCsr->eState=
36120 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
36130 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
36140 73 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 65  sr->skip;.    }e
36150 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
36160 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
36170 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36180 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f  Check some preco
36190 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20  nditions: .  ** 
361a0 20 20 28 61 29 20 74 68 65 20 63 75 72 73 6f 72    (a) the cursor
361b0 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69   is open for wri
361c0 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29  ting,.  **   (b)
361d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   there is no rea
361e0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  d-lock on the ta
361f0 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ble being modifi
36200 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  ed and.  **   (c
36210 29 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  ) the cursor poi
36220 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64 20 72  nts at a valid r
36230 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20  ow of an intKey 
36240 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
36250 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61 67 20  ( !pCsr->wrFlag 
36260 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36270 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
36280 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
36290 73 72 2d 3e 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  sr->pBt->readOnl
362a0 79 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  y .          && 
362b0 70 43 73 72 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pCsr->pBt->inTra
362c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
362d0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 63  WRITE );.  if( c
362e0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43  heckReadLocks(pC
362f0 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 73 72  sr->pBtree, pCsr
36300 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 73 72  ->pgnoRoot, pCsr
36310 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
36320 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
36330 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
36340 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
36350 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
36360 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53  }.  if( pCsr->eS
36370 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
36380 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70  ALID || !pCsr->p
36390 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
363a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
363b0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
363c0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
363d0 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 66 73 65  load(pCsr, offse
363e0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
363f0 64 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31  d char *)z, 0, 1
36400 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74  );.}../* .** Set
36410 20 61 20 66 6c 61 67 20 6f 6e 20 74 68 69 73 20   a flag on this 
36420 63 75 72 73 6f 72 20 74 6f 20 63 61 63 68 65 20  cursor to cache 
36430 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66  the locations of
36440 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
36450 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  .** overflow lis
36460 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
36470 74 20 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75  t row. This is u
36480 73 65 64 20 62 79 20 63 75 72 73 6f 72 73 20 6f  sed by cursors o
36490 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63  pened.** for inc
364a0 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f  remental blob IO
364b0 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   only..**.** Thi
364c0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
364d0 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65  a flag only. The
364e0 20 61 63 74 75 61 6c 20 70 61 67 65 20 6c 6f 63   actual page loc
364f0 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28  ation cache.** (
36500 73 74 6f 72 65 64 20 69 6e 20 42 74 43 75 72 73  stored in BtCurs
36510 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20  or.aOverflow[]) 
36520 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
36530 20 75 73 65 64 20 62 79 20 66 75 6e 63 74 69 6f   used by functio
36540 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61 79 6c 6f  n.** accessPaylo
36550 61 64 28 29 20 28 74 68 65 20 77 6f 72 6b 65 72  ad() (the worker
36560 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71   function for sq
36570 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 29  lite3BtreeData()
36580 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42   and.** sqlite3B
36590 74 72 65 65 50 75 74 44 61 74 61 28 29 29 2e 0a  treePutData())..
365a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
365b0 74 72 65 65 43 61 63 68 65 4f 76 65 72 66 6c 6f  treeCacheOverflo
365c0 77 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  w(BtCursor *pCur
365d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
365e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
365f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
36600 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36610 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
36620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
36630 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
36640 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
36650 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75  );.  assert(!pCu
36660 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
36670 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
36680 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23  bHandle = 1;.}.#
36690 65 6e 64 69 66 0a                                endif.