/ Hex Artifact Content
Login

Artifact dcbb9624c99e53cbb1d63e1c980fc9e93a02a06b:


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 38 31 20 32 30 30 38 2f 30  c,v 1.481 2008/0
0190: 37 2f 31 31 20 32 31 3a 30 32 3a 35 34 20 64 72  7/11 21:02:54 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65  qlite3BtreeTrace
03a0: 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
03b0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
03c0: 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 6e  /.#endif....#ifn
03d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
03e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
03f0: 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e 64  ** A flag to ind
0400: 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f 72  icate whether or
0410: 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63 68   not shared cach
0420: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20 41  e is enabled.  A
0430: 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  lso,.** a list o
0440: 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  f BtShared objec
0450: 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67  ts that are elig
0460: 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63 69  ible for partici
0470: 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61  pation.** in sha
0480: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 20  red cache.  The 
0490: 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20 66  variables have f
04a0: 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e 67  ile scope during
04b0: 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c 0a   normal builds,.
04c0: 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74 20  ** but the test 
04d0: 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74 6f  harness needs to
04e0: 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76 61   access these va
04f0: 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d 61  riables so we ma
0500: 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62 61  ke them.** globa
0510: 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c 64  l for test build
0520: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
0530: 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65  ITE_TEST.BtShare
0540: 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64  d *sqlite3Shared
0550: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 69  CacheList = 0;.i
0560: 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  nt sqlite3Shared
0570: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30  CacheEnabled = 0
0580: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42  ;.#else.static B
0590: 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65 33  tShared *sqlite3
05a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
05b0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
05c0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
05d0: 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  heEnabled = 0;.#
05e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
05f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0600: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0620: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0630: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0640: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0650: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0660: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0680: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
0690: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06b0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06c0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06d0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06e0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
06f0: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0700: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0710: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0720: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0730: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0740: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61 72  ){.  sqlite3Shar
0760: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0770: 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75 72   enable;.  retur
0780: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
0790: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  endif.../*.** Fo
07a0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
07b0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
07c0: 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
07d0: 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74 43  tree*, Pgno, BtC
07e0: 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a  ursor*, i64);...
07f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
0800: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0810: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75    /*.  ** The fu
0820: 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62  nctions queryTab
0830: 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61  leLock(), lockTa
0840: 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b  ble() and unlock
0850: 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a  AllTables().  **
0860: 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72   manipulate entr
0870: 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68 61  ies in the BtSha
0880: 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64  red.pLock linked
0890: 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73 74   list used to st
08a0: 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ore.  ** shared-
08b0: 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65  cache table leve
08c0: 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20  l locks. If the 
08d0: 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
08e0: 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  led with the.  *
08f0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  * shared-cache f
0900: 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c  eature disabled,
0910: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f   then there is o
0920: 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65  nly ever one use
0930: 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42  r.  ** of each B
0940: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
0950: 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f  e and so this lo
0960: 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  cking is not nec
0970: 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f  essary. .  ** So
0980: 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b   define the lock
0990: 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f   related functio
09a0: 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ns as no-ops..  
09b0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65  */.  #define que
09c0: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  ryTableLock(a,b,
09d0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
09e0: 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65  define lockTable
09f0: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0a00: 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f  K.  #define unlo
0a10: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23  ckAllTables(a).#
0a20: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0a40: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0a50: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0a60: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0a70: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0a80: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0a90: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0aa0: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0ab0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0ac0: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0ad0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0ae0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0af0: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b00: 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62   calling lockTab
0b10: 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c  le()), or.** SQL
0b20: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
0b30: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
0b40: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0b50: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
0b60: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
0b70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
0b80: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
0b90: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
0ba0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
0bb0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
0bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
0bd0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
0be0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
0bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
0c00: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a 20  p->db!=0 );.  . 
0c10: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f   /* This is a no
0c20: 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65  -op if the share
0c30: 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65  d-cache is not e
0c40: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
0c50: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  !p->sharable ){.
0c60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0c70: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
0c80: 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  If some other co
0c90: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
0ca0: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
0cb0: 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20   lock, the.  ** 
0cc0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d  requested lock m
0cd0: 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ay not be obtain
0ce0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
0cf0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 26  Bt->pExclusive &
0d00: 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  & pBt->pExclusiv
0d10: 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75  e!=p ){.    retu
0d20: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0d30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
0d40: 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63   (along with loc
0d50: 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65  kTable()) is whe
0d60: 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  re the ReadUncom
0d70: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20  mitted flag is. 
0d80: 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20   ** dealt with. 
0d90: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
0da0: 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20   querying for a 
0db0: 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68  read-lock and th
0dc0: 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73  e flag is.  ** s
0dd0: 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64  et, it is uncond
0de0: 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65  itionally grante
0df0: 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72  d - even if ther
0e00: 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b  e are write-lock
0e10: 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61  s.  ** on the ta
0e20: 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ble. If a write-
0e30: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
0e40: 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  d, the ReadUncom
0e50: 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a  mitted flag.  **
0e60: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
0e70: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  ed..  **.  ** In
0e80: 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61   function lockTa
0e90: 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64  ble(), if a read
0ea0: 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65  -lock is demande
0eb0: 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  d and the .  ** 
0ec0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0ed0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20  flag is set, no 
0ee0: 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74  entry is added t
0ef0: 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74  o the locks list
0f00: 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64   .  ** (BtShared
0f10: 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20  .pLock)..  **.  
0f20: 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a  ** To summarize:
0f30: 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f   If the ReadUnco
0f40: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
0f50: 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  set, then read c
0f60: 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e  ursors do.  ** n
0f70: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
0f80: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
0f90: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  . The locking pr
0fa0: 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20  ocedure for a . 
0fb0: 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72   ** write-cursor
0fc0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
0fd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
0fe0: 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61    0==(p->db->fla
0ff0: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
1000: 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20  committed) || . 
1010: 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f     eLock==WRITE_
1020: 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62  LOCK ||.    iTab
1030: 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20  ==MASTER_ROOT.  
1040: 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  ){.    for(pIter
1050: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1060: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1070: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1080: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1090: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
10a0: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20  able==iTab && . 
10b0: 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d           (pIter-
10c0: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c  >eLock!=eLock ||
10d0: 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43   eLock!=READ_LOC
10e0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  K) ){.        re
10f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1100: 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
1110: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1120: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1130: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
1140: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
1150: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1160: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1170: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ACHE./*.** Add a
1180: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
1190: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
11a0: 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20  e iTable to the 
11b0: 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65  shared-btree use
11c0: 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61  d.** by Btree ha
11d0: 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65  ndle p. Paramete
11e0: 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20  r eLock must be 
11f0: 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b  either READ_LOCK
1200: 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f   or .** WRITE_LO
1210: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
1220: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1230: 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61  if the lock is a
1240: 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
1250: 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  y. SQLITE_BUSY a
1260: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  nd.** SQLITE_NOM
1270: 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72  EM may also be r
1280: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1290: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65  ic int lockTable
12a0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
12b0: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
12c0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12d0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
12e0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
12f0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
1300: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
1310: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1320: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1330: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1340: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
1350: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
1360: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
1370: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69   );..  /* This i
1380: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
1390: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
13a0: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
13b0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
13c0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
13d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13e0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
13f0: 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65  E_OK==queryTable
1400: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1410: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
1420: 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  If the read-unco
1430: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
1440: 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c  set and a read-l
1450: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
1460: 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61  ,.  ** return ea
1470: 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69  rly without addi
1480: 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  ng an entry to t
1490: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
14a0: 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a  k list. See.  **
14b0: 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63   comment in func
14c0: 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c  tion queryTableL
14d0: 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69  ock() for more i
14e0: 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  nfo on handling 
14f0: 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e  .  ** the ReadUn
1500: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a  committed flag..
1510: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
1520: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  (p->db->flags&SQ
1530: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1540: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1550: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1560: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1570: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1580: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1590: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
15a0: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
15b0: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
15c0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
15d0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
15e0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
15f0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1600: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1610: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1620: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1630: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1640: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1650: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1670: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1680: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1690: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
16a0: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
16b0: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
16c0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
16d0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
16e0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
16f0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
1700: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
1710: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1720: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1730: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1740: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1750: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1770: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1780: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1790: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
17a0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
17b0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
17c0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
17d0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
17e0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
17f0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
1800: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
1810: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1820: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1830: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1840: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1850: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1860: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1870: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1880: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1890: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
18a0: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
18b0: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
18c0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
18d0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
18e0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
18f0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
1900: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
1910: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1920: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1940: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1950: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1960: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1970: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1980: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1990: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
19a0: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
19b0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
19c0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
19d0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
19e0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
19f0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
1a00: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
1a10: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1a20: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1a30: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a40: 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65    BtLock **ppIte
1a50: 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b  r = &pBt->pLock;
1a60: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1a70: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1a80: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1a90: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  t( p->sharable |
1aa0: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
1ab0: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
1ac0: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
1ad0: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
1ae0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1af0: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 30  t->pExclusive==0
1b00: 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75 73   || pBt->pExclus
1b10: 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ive==pLock->pBtr
1b20: 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ee );.    if( pL
1b30: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
1b40: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
1b50: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
1b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b70: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
1b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
1b90: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
1ba0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
1bb0: 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c 75   if( pBt->pExclu
1bc0: 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20 70  sive==p ){.    p
1bd0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d  Bt->pExclusive =
1be0: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1bf0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c00: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
1c20: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
1c30: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
1c40: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1c50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  */../*.** Verify
1c60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1c70: 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f   holds a mutex o
1c80: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a  n the BtShared.*
1c90: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
1cb0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
1cc0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
1cd0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
1ce0: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
1cf0: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
1d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d10: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
1d20: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
1d30: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1d40: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
1d50: 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66   cursor pCur, if
1d60: 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   any..*/.static 
1d70: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f  void invalidateO
1d80: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43  verflowCache(BtC
1d90: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1da0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1db0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1dc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1dd0: 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
1de0: 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72  );.  pCur->aOver
1df0: 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  flow = 0;.}../*.
1e00: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
1e10: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1e20: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
1e30: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
1e40: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
1e50: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
1e60: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
1e70: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
1e80: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1e90: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
1ea0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1eb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ec0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1ed0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
1ee0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
1ef0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1f00: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
1f10: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1f20: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  );.  }.}.#else. 
1f30: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1f40: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1f50: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
1f60: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1f70: 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e 64  lowCache(x).#end
1f80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  if../*.** Save t
1f90: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1fa0: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
1fb0: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
1fc0: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
1fd0: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
1fe0: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
1ff0: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
2000: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2020: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2030: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
2040: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
2050: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2060: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2070: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
2080: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
20a0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20b0: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
20c0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
20d0: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
20e0: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
20f0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
2100: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
2110: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
2120: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
2130: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
2140: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
2150: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
2160: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
2170: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
2180: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
2190: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
21a0: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
21b0: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
21c0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
21d0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
21e0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
21f0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
2200: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
2210: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2220: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
2230: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
2240: 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  y){.    void *pK
2250: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2260: 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  oc(pCur->nKey);.
2270: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
2280: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2290: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
22a0: 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20   0, pCur->nKey, 
22b0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
22c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22d0: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
22e0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
22f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2300: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2310: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
2320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2330: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
2350: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61  sert( !pCur->pPa
2360: 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  ge->intKey || !p
2370: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
2380: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2390: 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
23a0: 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
23b0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  );.    pCur->pPa
23c0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
23d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23e0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20  R_REQUIRESEEK;. 
23f0: 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   }..  invalidate
2400: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
2410: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
2420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
2430: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2440: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63   all cursors exc
2450: 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e  ept pExcept open
2460: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   on the table .*
2470: 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  * with root-page
2480: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
2490: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
24a0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
24b0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
24c0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
24d0: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
24e0: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
24f0: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
2500: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
2510: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
2520: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
2530: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
2540: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
2550: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
2560: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2570: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2580: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
2590: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
25a0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
25b0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
25c0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
25d0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
25e0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
25f0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
2600: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
2610: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
2620: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2630: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2640: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
2650: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
2660: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
2670: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
2680: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
26a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26b0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
26c0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
26d0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
26e0: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43 75  tic void clearCu
26f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
2700: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2710: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2720: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2730: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2740: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
2750: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2760: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2770: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
2790: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27a0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
27b0: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
27c0: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
27d0: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
27e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
27f0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
2800: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
2810: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
2820: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
2830: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
2840: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
2850: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
2860: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
2870: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
2880: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2890: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
28a0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
28b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
28c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
28d0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28e0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
28f0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2900: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
2910: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2920: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2930: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
2940: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2950: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
2960: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2970: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
2980: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
2990: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
29a0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29b0: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
29c0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
29d0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
29e0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
29f0: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29   0, &pCur->skip)
2a00: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2a20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
2a30: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
2a40: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
2a50: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a60: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a70: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2a80: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2a90: 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  D );.  }.  retur
2aa0: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
2ab0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2ac0: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
2ad0: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2ae0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
2af0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
2b00: 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75 72  3BtreeRestoreCur
2b10: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
2b20: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
2b30: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  TE_OK)../*.** De
2b40: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2b50: 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20  or not a cursor 
2b60: 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74  has moved from t
2b70: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a  he position it.*
2b80: 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65  * was last place
2b90: 64 20 61 74 2e 20 20 43 75 72 73 6f 72 20 63 61  d at.  Cursor ca
2ba0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
2bb0: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
2bc0: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
2bd0: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
2be0: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
2bf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2c00: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
2c10: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
2c20: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
2c30: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
2c40: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
2c50: 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75  to one if the cu
2c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61  rsor has moved a
2c70: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  nd 0 if not..*/.
2c80: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c90: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
2ca0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2cb0: 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a  nt *pHasMoved){.
2cc0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
2cd0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2ce0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2cf0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
2d00: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
2d10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d20: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2d30: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d40: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70  ID || pCur->skip
2d50: 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  !=0 ){.    *pHas
2d60: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  Moved = 1;.  }el
2d70: 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76  se{.    *pHasMov
2d80: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
2d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2da0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2db0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2dc0: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
2dd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
2de0: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
2df0: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
2e00: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2e10: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
2e20: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
2e30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
2e40: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
2e50: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
2e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
2e70: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
2e80: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2e90: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
2ea0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c 20  agesPerMapPage, 
2eb0: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
2ec0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ed0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2ee0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67  mutex) );.  nPag
2ef0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
2f00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2f10: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
2f20: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
2f30: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
2f40: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
2f50: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
2f60: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
2f70: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2f80: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
2f90: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
2fa0: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
2fb0: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
2fc0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
2fd0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
2fe0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
2ff0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3000: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
3010: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
3020: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
3030: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
3040: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
3050: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
3060: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
3070: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
3080: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3090: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
30a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
30b0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
30c0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
30d0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
30e0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
30f0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
3100: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
3110: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
3120: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
3130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
3140: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
3150: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
3160: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
3170: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
3180: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
3190: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
31a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
31b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
31c0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
31d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31e0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31f0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  );.  /* The mast
3200: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
3210: 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65  number must neve
3220: 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70  r be used as a p
3230: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3240: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
3250: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
3260: 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t, PENDING_BYTE_
3270: 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20  PAGE(pBt)) );.. 
3280: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
3290: 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
32a0: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
32b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
32c0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
32d0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
32e0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
32f0: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
3300: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
3310: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
3320: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
3330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
3350: 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  c;.  }.  offset 
3360: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
3370: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
3380: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
3390: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
33a0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
33b0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
33c0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
33d0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
33e0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
33f0: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
3400: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
3410: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
3420: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
3430: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
3440: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
3450: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
3460: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3470: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
3480: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
3490: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
34a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
34b0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
34c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
34d0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
34e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
34f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3500: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
3510: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
3520: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
3530: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
3540: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3550: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
3560: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
3570: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
3580: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
3590: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
35a0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
35b0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
35c0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
35d0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
35e0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
35f0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
3600: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3610: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
3620: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
3630: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
3640: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
3650: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
3660: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
3670: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
3680: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
3690: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
36a0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
36b0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
36c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
36d0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
36e0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
36f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
3700: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
3710: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
3720: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
3730: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3740: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3750: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3760: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3770: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3780: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3790: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
37a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
37b0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
37c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
37d0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
37e0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
37f0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
3800: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
3810: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74  AP_PTROFFSET(pBt
3820: 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  , key);.  assert
3830: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
3840: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
3850: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
3860: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
3870: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
3880: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
3890: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
38a0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
38b0: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
38c0: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
38d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38e0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
38f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3900: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
3910: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
3920: 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UM */../*.** Giv
3930: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
3940: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
3950: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
3960: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
3970: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
3980: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
3990: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
39a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
39b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
39c0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
39d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
39e0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
39f0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
3a00: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
3a10: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
3a20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
3a30: 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61  iCell) \.  ((pPa
3a40: 67 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74  ge)->aData + get
3a50: 32 62 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e  2byte(&(pPage)->
3a60: 61 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63  aData[(pPage)->c
3a70: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65  ellOffset+2*(iCe
3a80: 6c 6c 29 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ll)]))../*.** Th
3a90: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
3aa0: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
3ab0: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
3ac0: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
3ad0: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
3ae0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
3af0: 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73   See insert.*/.s
3b00: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
3b10: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
3b20: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
3b30: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
3b40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
3b60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
3b70: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
3b80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
3b90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
3ba0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
3bb0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
3bc0: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
3bd0: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
3be0: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
3bf0: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
3c00: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
3c10: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
3c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
3c30: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
3c40: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
3c50: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
3c60: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
3c70: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
3c80: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
3c90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
3ca0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
3cb0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
3cc0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
3cd0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
3ce0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
3cf0: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
3d00: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
3d10: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3d20: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3d30: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3d40: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3d50: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3d60: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
3d70: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
3d80: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
3d90: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
3da0: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
3db0: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
3dc0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
3dd0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
3de0: 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   of.** sqlite3Bt
3df0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3e00: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
3e10: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
3e20: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
3e30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
3e40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
3e50: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
3e60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
3e70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
3e80: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
3e90: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
3ea0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
3eb0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
3ec0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
3ed0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
3ee0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
3ef0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
3f00: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
3f10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3f20: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
3f30: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
3f40: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
3f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3f60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
3f70: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
3f80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3f90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3fa0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
3fb0: 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70  ) );..  pInfo->p
3fc0: 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
3fd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
3fe0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
3ff0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20  >leaf==1 );.  n 
4000: 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
4010: 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  rSize;.  assert(
4020: 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c   n==4-4*pPage->l
4030: 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61  eaf );.  if( pPa
4040: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
4050: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
4060: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
4070: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
4080: 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
4090: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  = 0;.  }.  pInfo
40a0: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
40b0: 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ad;.  if( pPage-
40c0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
40d0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
40e0: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29  Cell[n], (u64 *)
40f0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
4100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20   }else{.    u32 
4110: 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  x;.    n += getV
4120: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
4130: 5d 2c 20 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f  ], x);.    pInfo
4140: 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20  ->nKey = x;.    
4150: 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20  nPayload += x;. 
4160: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
4170: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
4180: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
4190: 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61  r = n;.  if( nPa
41a0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
41b0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
41c0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
41d0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
41e0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
41f0: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
4200: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
4210: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
4220: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
4230: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
4240: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
4250: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
4260: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  f cell content i
4270: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 70  n bytes */.    p
4280: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e  Info->nLocal = n
4290: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
42a0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
42b0: 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  0;.    nSize = n
42c0: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
42d0: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
42e0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4300: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
4310: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
4320: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53  Info->nSize = nS
4330: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
4340: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
4350: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
4360: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
4370: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
4380: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
4390: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
43a0: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
43b0: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
43c0: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
43d0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
43e0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
43f0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
4400: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
4410: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
4420: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
4430: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
4440: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
4450: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
4460: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
4470: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
4480: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
4490: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
44a0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
44b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
44c0: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
44d0: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
44e0: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
44f0: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
4500: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
4510: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
4520: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
4530: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
4540: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
4550: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
4560: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
4570: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
4580: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
4590: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
45a0: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
45b0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
45c0: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
45d0: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
45e0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
45f0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
4600: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
4610: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
4620: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
4630: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
4640: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
4650: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
4660: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66  ize - 4);.    if
4670: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
4680: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
4690: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73  Info->nLocal = s
46a0: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
46b0: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
46c0: 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61  nLocal = minLoca
46d0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
46e0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
46f0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
4700: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  n;.    pInfo->nS
4710: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
4720: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
4730: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
4740: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4750: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
4760: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4770: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
4780: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
4790: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
47a0: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
47b0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
47c0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
47d0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
47e0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
47f0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
4800: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
4810: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
4820: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
4830: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
4840: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
4850: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
4860: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
4870: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
4880: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4890: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
48a0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
48b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
48c0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
48d0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
48e0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
48f0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
4900: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
4910: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
4920: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
4930: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
4940: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
4950: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
4960: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
4970: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
4980: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
4990: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
49a0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
49b0: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
49c0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
49d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
49e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
49f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4a00: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
4a10: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4a20: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
4a30: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4a40: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4a50: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4a60: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4a70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4a80: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4a90: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4aa0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4ab0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
4ac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4ad0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
4ae0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
4af0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
4b00: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4b10: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4b20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4b30: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4b40: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4b50: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4b60: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4b70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4b80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
4b90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4ba0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4bb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
4bc0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
4bd0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4be0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4bf0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
4c10: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4c20: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4c30: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4c40: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
4c50: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4c60: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4c70: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
4c80: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
4c90: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4ca0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4cb0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
4cc0: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4cd0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4ce0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4cf0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
4d00: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4d10: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
4d20: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
4d30: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
4d40: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
4d50: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
4d60: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
4d70: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
4d80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
4d90: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
4da0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
4db0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4dc0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
4dd0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4de0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
4df0: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
4e00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4e10: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
4e20: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
4e30: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
4e40: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
4e50: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
4e60: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
4e70: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
4e80: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
4e90: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
4ea0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
4eb0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
4ec0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
4ed0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
4ee0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
4ef0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
4f00: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
4f10: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
4f20: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
4f30: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
4f40: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
4f50: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4f60: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
4f70: 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e  c void defragmen
4f80: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
4f90: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4fc0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4ff0: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
5000: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
5030: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
5040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
5050: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5080: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
5090: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50b0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
50c0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
50e0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
50f0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5100: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5110: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
5120: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
5130: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
5140: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
5150: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
5160: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5170: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
5180: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
5190: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
51b0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
51c0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
51d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
51e0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
51f0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5200: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5210: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
5220: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
5230: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
5240: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5250: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5260: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5270: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5280: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
5290: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
52a0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
52b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
52c0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
52d0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
52e0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
52f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5300: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5310: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
5320: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
5330: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
5340: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
5350: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5360: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
5370: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
5380: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
5390: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
53a0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
53b0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
53c0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
53d0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
53e0: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
53f0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5400: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
5410: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5420: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5430: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
5440: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
5450: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
5460: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
5470: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
5480: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
5490: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
54a0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
54b0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
54c0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
54d0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
54e0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
54f0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
5500: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
5510: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5520: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
5530: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
5540: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
5550: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
5560: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
5570: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
5580: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
5590: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
55a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
55b0: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
55c0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
55d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
55e0: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
55f0: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
5600: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
5610: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
5620: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
5630: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
5640: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5650: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
5660: 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  dr);.}../*.** Al
5670: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
5680: 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61  es of space on a
5690: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   page..**.** Ret
56a0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
56b0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
56c0: 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  ] of the first b
56d0: 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  yte of.** the ne
56e0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  w allocation.  T
56f0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
5700: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
5710: 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70 61  is enough.** spa
5720: 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ce.  This routin
5730: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61 69  e will never fai
5740: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
5750: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42  page contains nB
5760: 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61  ytes of free spa
5770: 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ce but does not 
5780: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65  contain.** nByte
5790: 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  s of contiguous 
57a0: 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e  free space, then
57b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75   this routine au
57c0: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63  tomatically.** c
57d0: 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74  alls defragement
57e0: 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c  Page() to consol
57f0: 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73  idate all free s
5800: 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20  pace before .** 
5810: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e  allocating the n
5820: 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  ew chunk..*/.sta
5830: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
5840: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
5850: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
5860: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63  {.  int addr, pc
5870: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a  , hdr;.  int siz
5880: 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a  e;.  int nFrag;.
5890: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74    int top;.  int
58a0: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65   nCell;.  int ce
58b0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69  llOffset;.  unsi
58c0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
58d0: 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61  .  .  data = pPa
58e0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
58f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5900: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5910: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5920: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5930: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
5940: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5950: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5960: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5970: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
5980: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
5990: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
59a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
59b0: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
59c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
59d0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
59e0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
59f0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20  -= nByte;.  hdr 
5a00: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
5a10: 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64  et;..  nFrag = d
5a20: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
5a30: 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20  ( nFrag<60 ){.  
5a40: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
5a50: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
5a60: 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20   for a slot big 
5a70: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
5a80: 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61  y the.    ** spa
5a90: 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20  ce request. */. 
5aa0: 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b     addr = hdr+1;
5ab0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20  .    while( (pc 
5ac0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5ad0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
5ae0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
5af0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
5b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
5b10: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
5b20: 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74     if( size<nByt
5b30: 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e+4 ){.         
5b40: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
5b50: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
5b60: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
5b70: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61  ta[hdr+7] = nFra
5b80: 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  g + size - nByte
5b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5ba0: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
5bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5bc0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
5bd0: 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65  c+2], size-nByte
5be0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5bf0: 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20  urn pc + size - 
5c00: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d  nByte;.        }
5c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
5c20: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a  ddr = pc;.    }.
5c30: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
5c40: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
5c50: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
5c60: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
5c70: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
5c80: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
5c90: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
5ca0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
5cb0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
5cc0: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
5cd0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
5ce0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
5cf0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
5d00: 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36  ;.  if( nFrag>=6
5d10: 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20  0 || cellOffset 
5d20: 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20  + 2*nCell > top 
5d30: 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 64  - nByte ){.    d
5d40: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
5d50: 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  age);.    top = 
5d60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5d70: 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f  dr+5]);.  }.  to
5d80: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73  p -= nByte;.  as
5d90: 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74  sert( cellOffset
5da0: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f   + 2*nCell <= to
5db0: 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  p );.  put2byte(
5dc0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
5dd0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70  p);.  return top
5de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5df0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
5e00: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
5e10: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
5e20: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
5e30: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
5e40: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
5e50: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
5e60: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
5e70: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
5e80: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
5e90: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
5ea0: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
5eb0: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
5ec0: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
5ed0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
5ee0: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
5ef0: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
5f00: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70  atic void freeSp
5f10: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
5f20: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
5f30: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
5f40: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
5f50: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
5f60: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
5f70: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
5f80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
5f90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
5fa0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5fb0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5fc0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5fd0: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
5fe0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
5ff0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
6000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
6010: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
6020: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
6030: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
6040: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6050: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6060: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
6070: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
6080: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
6090: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
60a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
60b0: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
60c0: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
60d0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
60e0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
60f0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
6100: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
6110: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
6120: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
6130: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
6140: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
6150: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
6160: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
6170: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
6180: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
6190: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
61a0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
61b0: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
61c0: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
61d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
61e0: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
61f0: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
6200: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6210: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
6220: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
6230: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
6240: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72  addr );.    addr
6250: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
6260: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6270: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
6280: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61  bleSize-4 );.  a
6290: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
62a0: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
62b0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
62c0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
62d0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
62e0: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
62f0: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
6300: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
6310: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
6320: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a  nFree += size;..
6330: 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64    /* Coalesce ad
6340: 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63  jacent free bloc
6350: 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70  ks */.  addr = p
6360: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
6370: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
6380: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
6390: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
63a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78   ){.    int pnex
63b0: 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73  t, psize;.    as
63c0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
63d0: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
63e0: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
63f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
6400: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
6410: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6420: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
6430: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
6440: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
6450: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
6460: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
6470: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
6480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
6490: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
64a0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
64b0: 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d    assert( frag<=
64c0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
64d0: 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20  ffset+7] );.    
64e0: 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64    data[pPage->hd
64f0: 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72  rOffset+7] -= fr
6500: 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ag;.      put2by
6510: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6520: 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  , get2byte(&data
6530: 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20  [pnext]));.     
6540: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6550: 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74  pbegin+2], pnext
6560: 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  +get2byte(&data[
6570: 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e  pnext+2])-pbegin
6580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6590: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
65a0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
65b0: 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  /* If the cell c
65c0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69  ontent area begi
65d0: 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c  ns with a freebl
65e0: 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20  ock, remove it. 
65f0: 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  */.  if( data[hd
6600: 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35  r+1]==data[hdr+5
6610: 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] && data[hdr+2]
6620: 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b  ==data[hdr+6] ){
6630: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  .    int top;.  
6640: 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62    pbegin = get2b
6650: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
6660: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
6670: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74  ata[hdr+1], &dat
6680: 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20  a[pbegin], 2);. 
6690: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
66a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
66b0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
66c0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20  ata[hdr+5], top 
66d0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
66e0: 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20  [pbegin+2]));.  
66f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  }.}../*.** Decod
6700: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
6710: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
6720: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
6730: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
6740: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
6750: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
6760: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
6770: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
6780: 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46  tic void decodeF
6790: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
67a0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
67b0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
67c0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
67d0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
67e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
67f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
6800: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
6810: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
6820: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6830: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6840: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6850: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
6860: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
6870: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
6880: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
6890: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
68a0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
68b0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
68c0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
68d0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
68e0: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
68f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
6900: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
6910: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
6920: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
6930: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
6940: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
6950: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
6960: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
6970: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6980: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
6990: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
69a0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
69b0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
69c0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
69d0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
69e0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
69f0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
6a00: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6a10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
6a20: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6a30: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
6a40: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
6a50: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
6a60: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
6a70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
6a80: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
6a90: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
6aa0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
6ab0: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
6ac0: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
6ad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
6ae0: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
6af0: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
6b00: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
6b10: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
6b20: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
6b30: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
6b40: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
6b50: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
6b60: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
6b70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
6b80: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
6b90: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
6ba0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
6bb0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
6bc0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
6bd0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
6be0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
6bf0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
6c00: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
6c10: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
6c20: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
6c30: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
6c40: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
6c50: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
6c60: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
6c70: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
6c80: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
6c90: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
6ca0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
6cb0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
6cc0: 20 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74   page to be init
6cd0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d  ialized */.  Mem
6ce0: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
6cf0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
6d00: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6d10: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63  L */.){.  int pc
6d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6d30: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
6d40: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
6d50: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
6d60: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
6d70: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
6d80: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
6d90: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
6da0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
6db0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
6dc0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
6dd0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
6de0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
6df0: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
6e00: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  re */.  int usab
6e10: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
6e20: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
6e30: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
6e40: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6e50: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
6e60: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
6e70: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
6e80: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
6e90: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
6ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6eb0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
6ec0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
6ed0: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
6ee0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
6ef0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
6f00: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
6f10: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
6f20: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
6f30: 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20  ed to check all 
6f40: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65  cell offsets are
6f50: 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 75   in range */.  u
6f60: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
6f70: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6f80: 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  end of cell offs
6f90: 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38  et array */.  u8
6fa0: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
6fb0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
6fc0: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65   that must be ze
6fd0: 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c  ro in MSB of cel
6fe0: 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 0a 20 20  l offsets */..  
6ff0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
7000: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21  ;.  assert( pBt!
7010: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7020: 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50  pParent==0 || pP
7030: 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20  arent->pBt==pBt 
7040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7050: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7060: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7070: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7080: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
7090: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
70a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
70b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
70c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
70d0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
70e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
70f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
7100: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
7110: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
7120: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
7130: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
7140: 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28 70 50  !=pParent && (pP
7150: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20  age->pParent!=0 
7160: 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  || pPage->isInit
7170: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
7180: 70 61 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75  parent page shou
7190: 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20  ld never change 
71a0: 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20  unless the file 
71b0: 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  is corrupt */.  
71c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
71d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
71e0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  }.  if( pPage->i
71f0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
7200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
7210: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
7220: 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20  0 && pParent!=0 
7230: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50  ){.    pPage->pP
7240: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
7250: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
7260: 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
7270: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64  bPage);.  }.  hd
7280: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
7290: 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
72a0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64  Page->aData;.  d
72b0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
72c0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20  , data[hdr]);.  
72d0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
72e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
72f0: 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75  dxShift = 0;.  u
7300: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
7310: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
7320: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7330: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
7340: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
7350: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20  ge->leaf;.  top 
7360: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7370: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67  [hdr+5]);.  pPag
7380: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
7390: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
73a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
73b0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
73c0: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
73d0: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
73e0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
73f0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
7400: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
7410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7420: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7430: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
7440: 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  l==0 && pParent!
7450: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70  =0 && pParent->p
7460: 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  gno!=1 ){.    /*
7470: 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20   All pages must 
7480: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
7490: 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66  e cell, except f
74a0: 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  or root pages */
74b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
74c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
74d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
74e0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
74f0: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
7500: 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  age */.  pc = ge
7510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7520: 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
7530: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
7540: 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20  p - (cellOffset 
7550: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
7560: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30  );.  while( pc>0
7570: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74   ){.    int next
7580: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
7590: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
75a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
75b0: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
75c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
75d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
75e0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
75f0: 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65   }.    next = ge
7600: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
7610: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  );.    size = ge
7620: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
7630: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  2]);.    if( nex
7640: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
7650: 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20  size+3 ){.      
7660: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
7670: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
7680: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
7690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
76a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
76b0: 20 20 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20      }.    nFree 
76c0: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20  += size;.    pc 
76d0: 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50  = next;.  }.  pP
76e0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72  age->nFree = nFr
76f0: 65 65 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e  ee;.  if( nFree>
7700: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  =usableSize ){. 
7710: 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65     /* Free space
7720: 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74   cannot exceed t
7730: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
7740: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
7750: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7760: 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  ; .  }..  /* Che
7770: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
7780: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
7790: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
77a0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
77b0: 65 2e 20 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20 7e  e. */.  mask = ~
77c0: 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  (((u8)(pBt->page
77d0: 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20  Size>>8))-1);.  
77e0: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
77f0: 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d  lOffset + pPage-
7800: 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f 72  >nCell*2];.  for
7810: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
7820: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
7830: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
7840: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
7850: 3b 0a 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45  ;.  if( pOff!=pE
7860: 6e 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nd ){.    return
7870: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7880: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  BKPT;.  }..  pPa
7890: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
78a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
78b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
78c0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
78d0: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
78e0: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
78f0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
7900: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
7910: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
7920: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
7930: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
7940: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7950: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7960: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
7970: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
7980: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
7990: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
79a0: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
79b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
79c0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
79d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
79e0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
79f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a00: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7a10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7a20: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
7a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7a40: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7a50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7a60: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
7a70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7a80: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
7a90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
7aa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ab0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7ac0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d  t->mutex) );.  m
7ad0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
7ae0: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
7af0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64  Size - hdr);.  d
7b00: 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73  ata[hdr] = flags
7b10: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
7b20: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
7b30: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20  PTF_LEAF)==0);. 
7b40: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
7b50: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
7b60: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
7b70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7b80: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
7b90: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
7ba0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
7bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
7bc0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
7bd0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
7be0: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7bf0: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
7c00: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
7c10: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
7c20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
7c30: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
7c40: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
7c50: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
7c60: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
7c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
7c80: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
7c90: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
7ca0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
7cb0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
7cc0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
7cd0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
7ce0: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
7cf0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
7d00: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
7d10: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
7d20: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
7d30: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
7d40: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
7d50: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
7d60: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
7d70: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
7d80: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
7d90: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
7da0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
7db0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
7dc0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
7dd0: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
7de0: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
7df0: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
7e00: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
7e10: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
7e20: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
7e30: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
7e40: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
7e50: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
7e60: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7e70: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7e80: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
7e90: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
7ea0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7eb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7ec0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
7ed0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
7ee0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
7ef0: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
7f00: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
7f10: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
7f20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7f30: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
7f40: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
7f50: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7f60: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
7f70: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7f80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7f90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7fa0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7fb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7fc0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
7fd0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
7fe0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
7ff0: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
8000: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8010: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
8020: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
8030: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
8040: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
8050: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
8060: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8070: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
8080: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
8090: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
80a0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
80b0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
80c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
80d0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
80e0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
80f0: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
8100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
8120: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
8130: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
8140: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
8150: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
8160: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
8170: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
8180: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
8190: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
81a0: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
81b0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
81c0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
81d0: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
81e0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
81f0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
8200: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8210: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8230: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
8240: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
8250: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
8260: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
8270: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
8280: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
8290: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
82a0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
82b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
82c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
82d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
82e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
82f0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8310: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
8320: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
8330: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
8340: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
8350: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
8360: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
8370: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
8380: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8390: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
83a0: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
83b0: 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  nt);.    if( rc!
83c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
83d0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
83e0: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
83f0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
8400: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8410: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
8420: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
8430: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
8440: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
8450: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
8460: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
8470: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
8480: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
8490: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
84a0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
84b0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
84c0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
84d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
84e0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
84f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8500: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8510: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
8520: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
8530: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8540: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
8550: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
8560: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
8570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8580: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8590: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
85a0: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
85b0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
85c0: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
85d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
85e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
85f0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
8600: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
8610: 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20  page.** reaches 
8620: 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74  zero.  We need t
8630: 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72  o unref the pPar
8640: 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e  ent pointer when
8650: 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73   that.** happens
8660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8670: 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28   pageDestructor(
8680: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
8690: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
86a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
86b0: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
86c0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
86d0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
86e0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
86f0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
8700: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8710: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73  ->isInit==0 || s
8720: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8730: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8740: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
8750: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  age->pParent ){.
8760: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
8770: 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
8780: 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  arent;.    asser
8790: 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d  t( pParent->pBt=
87a0: 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20  =pPage->pBt );. 
87b0: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
87c0: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
87d0: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
87e0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
87f0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
8800: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
8810: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
8820: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
8830: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
8840: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
8850: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
8860: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
8870: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
8880: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
8890: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
88a0: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
88b0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
88c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
88d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
88e0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
88f0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
8900: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
8910: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
8920: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
8930: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
8940: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
8950: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
8960: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
8970: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
8980: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8990: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
89a0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
89b0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
89c0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
89d0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
89e0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
89f0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
8a00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8a10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8a20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
8a30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
8a40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
8a50: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
8a60: 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ge, pPage->pPare
8a70: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt);.  }.}../*.*
8a80: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
8a90: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
8aa0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
8ab0: 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
8ac0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
8ad0: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  er(void *pArg, i
8ae0: 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65  nt n){.  BtShare
8af0: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
8b00: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
8b10: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
8b20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8b30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8b40: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
8b50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
8b60: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
8b70: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
8b80: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
8b90: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
8ba0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
8bb0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
8bc0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
8bd0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
8be0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
8bf0: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
8c00: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
8c10: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
8c20: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
8c30: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
8c40: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
8c50: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
8c60: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
8c70: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
8c80: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
8c90: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
8ca0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
8cb0: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
8cc0: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
8cd0: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
8ce0: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
8cf0: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
8d00: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
8d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
8d20: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
8d30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
8d40: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
8d50: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8d60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
8d70: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
8d80: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
8d90: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
8da0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
8db0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8dc0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
8dd0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
8de0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8e00: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
8e10: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
8e20: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
8e30: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
8e40: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
8e50: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
8e60: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
8e70: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f     /* The VFS to
8e80: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74   use for this bt
8e90: 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ree */.  BtShare
8ea0: 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
8eb0: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
8ec0: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
8ed0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
8ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8ef0: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
8f00: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
8f10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
8f20: 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  nt nReserve;.  u
8f30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
8f40: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
8f50: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
8f60: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
8f70: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
8f80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
8f90: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
8fa0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
8fb0: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
8fc0: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
8fd0: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
8fe0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
8ff0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
9000: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
9010: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
9020: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
9030: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
9040: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9050: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9060: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
9070: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9080: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
9090: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
90a0: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
90b0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
90c0: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
90d0: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
90e0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
90f0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
9100: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
9110: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
9120: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9130: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9140: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
9150: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
9160: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
9170: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9180: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
9190: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
91a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
91b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
91c0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
91d0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
91e0: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
91f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9200: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9210: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9220: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
9230: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
9240: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
9250: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
9260: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
9270: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
9280: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
9290: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
92a0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
92b0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
92c0: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
92d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
92e0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
92f0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
9300: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
9310: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
9320: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
9330: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
9340: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
9350: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
9360: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
9370: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
9380: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
9390: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
93a0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
93b0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
93c0: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
93d0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
93e0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
93f0: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
9400: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
9410: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9420: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
9430: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9440: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9460: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
9470: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
9480: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
9490: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
94a0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
94b0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
94c0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
94d0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
94e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
94f0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
9500: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
9510: 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68 61  r(pBt=sqlite3Sha
9520: 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70 42  redCacheList; pB
9530: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
9540: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
9550: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
9560: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
9570: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
9580: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
9590: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
95a0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
95c0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
95d0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
95e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
95f0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
9600: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
9610: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
9620: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9640: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9650: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9660: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9670: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
9680: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9690: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
96a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
96b0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
96c0: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
96d0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
96e0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
96f0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
9700: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
9710: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
9720: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
9730: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
9740: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
9750: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
9760: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9770: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
9780: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
9790: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
97a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
97b0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
97c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
97d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
97e0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
97f0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
9800: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
9810: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
9820: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
9830: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
9840: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
9850: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
9860: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
9870: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
9880: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
9890: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
98a0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
98b0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
98c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
98d0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
98e0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
98f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9900: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
9910: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
9920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9930: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
9940: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
9950: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
9960: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
9970: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
9980: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
9990: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
99a0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
99b0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
99c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
99d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
99e0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
99f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
9a00: 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20 3d  >busyHdr.xFunc =
9a10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76   sqlite3BtreeInv
9a20: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  okeBusyHandler;.
9a30: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9a40: 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20 20  .pArg = pBt;.   
9a50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9a60: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
9a70: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
9a80: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
9ab0: 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  s, vfsFlags);.  
9ac0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9ae0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
9af0: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
9b00: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
9b10: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
9b20: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
9b30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9b40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
9b50: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
9b60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9b70: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
9b80: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
9b90: 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64 72  r, &pBt->busyHdr
9ba0: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
9bb0: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
9bc0: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
9bd0: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
9be0: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
9bf0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
9c00: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9c10: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9c20: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
9c30: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
9c40: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
9c50: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
9c60: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
9c70: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
9c80: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
9c90: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
9ca0: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
9cb0: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
9cc0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
9cd0: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
9ce0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
9cf0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
9d00: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
9d10: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
9d20: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
9d30: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
9d40: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
9d50: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
9d60: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
9d70: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
9d80: 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ze);.#ifndef SQL
9d90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9da0: 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
9db0: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
9dc0: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
9dd0: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
9de0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
9df0: 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
9e00: 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
9e10: 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
9e20: 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
9e30: 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
9e40: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
9e50: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
9e60: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
9e70: 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
9e80: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
9e90: 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
9ea0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
9eb0: 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
9ec0: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
9ed0: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
9ee0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
9ef0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
9f00: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
9f10: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
9f20: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
9f30: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
9f40: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
9f50: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
9f60: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9f70: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
9f80: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
9f90: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
9fa0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9fb0: 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
9fc0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
9fd0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
9fe0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
9ff0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
a000: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
a010: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
a020: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
a030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a040: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
a050: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a060: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
a070: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
a080: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
a090: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
a0a0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
a0b0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
a0c0: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
a0d0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73     }.    pBt->us
a0e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
a0f0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
a100: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
a110: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
a120: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
a130: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
a140: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
a150: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
a160: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
a170: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
a180: 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66  geSize);.   .#if
a190: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a1a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
a1b0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
a1c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
a1d0: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
a1e0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
a1f0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
a200: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
a210: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
a220: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
a230: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
a240: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
a250: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
a260: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
a270: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
a280: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
a290: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a2a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
a2b0: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
a2c0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a2d0: 45 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66  E && sqlite3Conf
a2e0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
a2f0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
a300: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
a310: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
a320: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
a330: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
a340: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
a350: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a360: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
a370: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a390: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a3a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a3c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a3d0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a3e0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
a3f0: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a400: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a410: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a420: 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20  heList = pBt;.  
a430: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a440: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
a450: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
a460: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
a470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a480: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
a490: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a4a0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a4b0: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
a4c0: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
a4d0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
a4e0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
a4f0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
a500: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
a510: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
a520: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
a530: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
a540: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
a550: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
a560: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
a570: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
a580: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a590: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
a5a0: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
a5b0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a5c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
a5d0: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
a5e0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
a5f0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
a600: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
a610: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
a620: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
a630: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
a640: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
a650: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
a660: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
a670: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
a680: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
a690: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
a6a0: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
a6b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
a6c0: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
a6d0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
a6e0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
a6f0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
a700: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
a710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a720: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
a730: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
a740: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
a750: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
a760: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
a770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
a780: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a790: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a7a0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
a7b0: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
a7c0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
a7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a7e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
a7f0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
a800: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
a810: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a820: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
a830: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
a840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
a850: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
a860: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
a870: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
a880: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
a890: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
a8a0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
a8b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a8c0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
a8d0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a8e0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
a8f0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
a900: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
a910: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a920: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
a930: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
a940: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
a950: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
a960: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
a970: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
a980: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
a990: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
a9a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a9b0: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
a9c0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
a9d0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
a9e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a9f0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
aa00: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
aa10: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
aa20: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
aa30: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
aa40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
aa50: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
aa60: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
aa70: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
aa80: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
aa90: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
aaa0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aab0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
aac0: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
aad0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
aae0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
aaf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
ab00: 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  ist==pBt ){.    
ab10: 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43    sqlite3SharedC
ab20: 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e  acheList = pBt->
ab30: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
ab40: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
ab50: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
ab60: 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68  heList;.      wh
ab70: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
ab80: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
ab90: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
aba0: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
abb0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
abc0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
abd0: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
abe0: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
abf0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
ac00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ac10: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
ac20: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
ac30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
ac40: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
ac50: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
ac60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
ac70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
ac80: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
ac90: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
aca0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
acb0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
acc0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
acd0: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
ace0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
acf0: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
ad00: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
ad10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
ad20: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
ad30: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ad40: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
ad50: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
ad60: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
ad70: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
ad80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
ad90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
ada0: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
adb0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
ade0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
adf0: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
ae00: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
ae10: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
ae20: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
ae30: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
ae40: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
ae50: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
ae60: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
ae70: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
ae80: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
ae90: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
aea0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
aeb0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
aec0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
aed0: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
aee0: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
aef0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
af00: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
af10: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
af20: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
af30: 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
af40: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
af50: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
af60: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
af70: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
af80: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
af90: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
afa0: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
afb0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
afc0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
afd0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
afe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
aff0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
b000: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
b010: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
b020: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
b030: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
b040: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b050: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
b060: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
b070: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
b080: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
b090: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
b0a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b0b0: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
b0c0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
b0d0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
b0e0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
b0f0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
b100: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
b110: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
b120: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
b130: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
b140: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
b150: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
b160: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
b170: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
b180: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
b190: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
b1a0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
b1b0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
b1c0: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
b1d0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
b1e0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
b1f0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
b200: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
b210: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
b220: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
b230: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
b240: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
b250: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
b260: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
b270: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b280: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
b290: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
b2a0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
b2b0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
b2c0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
b2d0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
b2e0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
b2f0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
b300: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
b310: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b320: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
b330: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
b340: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
b350: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
b360: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b370: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b380: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
b390: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b3a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b3b0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
b3c0: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
b3d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b3e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
b3f0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
b400: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
b410: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
b420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
b430: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b440: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b450: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
b460: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
b470: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
b480: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
b490: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
b4a0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
b4b0: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
b4c0: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
b4d0: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
b4e0: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
b4f0: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
b500: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
b510: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
b520: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
b530: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
b540: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
b550: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
b560: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
b570: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
b580: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
b590: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
b5a0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
b5b0: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
b5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
b5d0: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
b5e0: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
b5f0: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
b600: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
b610: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
b620: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
b630: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
b640: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
b650: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b660: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
b670: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
b680: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
b690: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
b6a0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
b6b0: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
b6c0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
b6d0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
b6e0: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
b6f0: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
b700: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b710: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
b720: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
b730: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
b740: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
b750: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b760: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
b770: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
b780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
b790: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
b7a0: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
b7b0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
b7c0: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
b7d0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
b7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b7f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
b800: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
b810: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
b820: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
b830: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
b840: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
b850: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
b860: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
b870: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
b880: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
b890: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
b8a0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
b8b0: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
b8c0: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
b8d0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
b8e0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
b8f0: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
b900: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
b910: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
b920: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
b930: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
b940: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
b950: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
b960: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
b970: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
b980: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
b990: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
b9a0: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
b9b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b9c0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
b9d0: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
b9e0: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
b9f0: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
ba00: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
ba10: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
ba20: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
ba30: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
ba40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ba50: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
ba60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
ba70: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
ba80: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
ba90: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
baa0: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
bab0: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
bac0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
bad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bae0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
baf0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bb00: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
bb10: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
bb20: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
bb30: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
bb40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
bb50: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
bb60: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
bb70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bb80: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
bb90: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
bba0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
bbb0: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
bbc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bbd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bbe0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
bbf0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bc00: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
bc10: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
bc20: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
bc30: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
bc40: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
bc50: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
bc60: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
bc70: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
bc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bc90: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
bca0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bcb0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
bcc0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
bcd0: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
bce0: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
bcf0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
bd00: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
bd10: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
bd20: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
bd30: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
bd40: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
bd50: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
bd60: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
bd70: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
bd80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
bd90: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
bda0: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
bdb0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
bdc0: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
bdd0: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
bde0: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
bdf0: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
be00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
be10: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
be20: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
be30: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
be40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
be50: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
be60: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
be70: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
be80: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
be90: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
bea0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
beb0: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
bec0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
bed0: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
bee0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
bef0: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
bf00: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
bf10: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
bf20: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
bf30: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
bf40: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
bf50: 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
bf60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bf70: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
bf80: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
bf90: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
bfa0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
bfb0: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
bfc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bfd0: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
bfe0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
bff0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
c000: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
c010: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
c020: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
c030: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
c040: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
c050: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
c060: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
c070: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
c080: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c090: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
c0a0: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
c0b0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
c0c0: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
c0d0: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
c0e0: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
c0f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
c100: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
c110: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
c120: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c130: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
c140: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
c150: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
c160: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
c170: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
c180: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
c190: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c1a0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c1b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c1c0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
c1d0: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
c1e0: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
c1f0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c200: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
c210: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
c220: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
c230: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c240: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
c250: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
c260: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c270: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
c280: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
c290: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c2a0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c2b0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c2c0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c2d0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
c2e0: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
c2f0: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
c300: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
c310: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
c320: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
c330: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
c340: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
c350: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
c360: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
c370: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
c380: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
c390: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
c3a0: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
c3b0: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
c3c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
c3d0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c3e0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
c3f0: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
c400: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
c410: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
c420: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c430: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
c440: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
c450: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c460: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c470: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c480: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
c490: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
c4a0: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
c4b0: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
c4c0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
c4d0: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
c4e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c4f0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
c500: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
c510: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
c520: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
c530: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
c540: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
c550: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
c560: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
c570: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
c580: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
c590: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
c5a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c5b0: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
c5c0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
c5d0: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
c5e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c5f0: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c600: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c610: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
c620: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c630: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
c640: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61  LITE_OK;.  int a
c650: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  v = (autoVacuum?
c660: 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  1:0);..  sqlite3
c670: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c680: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c690: 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70  zeFixed && av!=p
c6a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
c6b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
c6c0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
c6d0: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
c6e0: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20  toVacuum = av;. 
c6f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
c700: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c710: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
c720: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c730: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c740: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
c750: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
c760: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
c770: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
c780: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
c790: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c7a0: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
c7b0: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
c7c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
c7d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
c7e0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
c7f0: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
c800: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
c810: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c820: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
c830: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
c840: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
c850: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
c860: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
c870: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c880: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
c890: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
c8a0: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
c8b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c8c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c8d0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
c8e0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
c8f0: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
c900: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c910: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
c920: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
c930: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
c940: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
c950: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
c960: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
c970: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
c980: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
c990: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
c9a0: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
c9b0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
c9c0: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
c9d0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
c9e0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
c9f0: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
ca00: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
ca10: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
ca20: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
ca30: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
ca40: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
ca50: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
ca60: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
ca70: 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61  Page1;.  int nPa
ca80: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
ca90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
caa0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
cab0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
cac0: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
cad0: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
cae0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
caf0: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
cb00: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
cb10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
cb20: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
cb30: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
cb40: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
cb50: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
cb60: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
cb70: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
cb80: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
cb90: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
cba0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
cbb0: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
cbc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cbd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
cbe0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cbf0: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
cc00: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
cc10: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
cc20: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
cc30: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
cc40: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
cc50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
cc60: 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
cc70: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
cc80: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
cc90: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
cca0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
ccb0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
ccc0: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
ccd0: 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
cce0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
ccf0: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
cd00: 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
cd10: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
cd20: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
cd30: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
cd40: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
cd50: 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
cd60: 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
cd70: 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
cd80: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
cd90: 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
cda0: 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
cdb0: 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
cdc0: 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
cdd0: 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
cde0: 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
cdf0: 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
ce00: 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
ce10: 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
ce20: 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
ce30: 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
ce40: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
ce50: 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
ce60: 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
ce70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
ce80: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
ce90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
cea0: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
ceb0: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
cec0: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
ced0: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
cee0: 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
cef0: 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
cf00: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
cf10: 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
cf20: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
cf30: 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
cf40: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
cf50: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
cf60: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
cf70: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
cf80: 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
cf90: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
cfa0: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
cfb0: 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
cfc0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
cfd0: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
cfe0: 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
cff0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d000: 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
d010: 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
d020: 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
d030: 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
d040: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
d050: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
d060: 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
d070: 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
d080: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
d090: 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
d0a0: 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
d0b0: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
d0c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
d0d0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
d0e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
d0f0: 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
d100: 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
d110: 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
d120: 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
d130: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
d140: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
d150: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
d160: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
d170: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d180: 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
d190: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
d1a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
d1b0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
d1c0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
d1d0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
d1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d1f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
d200: 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a  ableSize<500 ){.
d210: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d220: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d230: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
d240: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d250: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
d260: 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
d270: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
d280: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d290: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
d2a0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
d2b0: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
d2c0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
d2d0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
d2e0: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
d2f0: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
d300: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
d310: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
d320: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
d330: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
d340: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
d350: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
d360: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
d370: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
d380: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
d390: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
d3a0: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
d3b0: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
d3c0: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
d3d0: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
d3e0: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
d3f0: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
d400: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
d410: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
d420: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
d430: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
d440: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
d450: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
d460: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
d470: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
d480: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
d490: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
d4a0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
d4b0: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
d4c0: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
d4d0: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
d4e0: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
d4f0: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
d500: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
d510: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
d520: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
d530: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
d540: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
d550: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
d560: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
d570: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
d580: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
d590: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
d5a0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d5b0: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
d5c0: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
d5d0: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
d5e0: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
d5f0: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
d600: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d610: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
d620: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
d630: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
d640: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
d650: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
d660: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
d670: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
d680: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d690: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
d6a0: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
d6b0: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
d6c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d6d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
d6e0: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
d6f0: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
d700: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
d710: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
d720: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
d730: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
d740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
d750: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
d760: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
d770: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d780: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
d790: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
d7a0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
d7b0: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
d7c0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
d7d0: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
d7e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
d7f0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
d800: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
d810: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
d820: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d830: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
d840: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
d850: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
d860: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
d870: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
d880: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
d890: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
d8a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d8b0: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
d8c0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
d8d0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
d8e0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
d8f0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
d900: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
d910: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
d920: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
d930: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
d940: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
d950: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
d960: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
d970: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
d980: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
d990: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
d9a0: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
d9b0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
d9c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d9d0: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
d9e0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
d9f0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
da00: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
da10: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
da20: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
da30: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
da40: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
da50: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
da60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
da70: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
da80: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
da90: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
daa0: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
dab0: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
dac0: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
dad0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dae0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
daf0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
db00: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
db10: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
db20: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
db30: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
db40: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
db50: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
db60: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
db70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
db80: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
db90: 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  a );.#if 0.     
dba0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
dbb0: 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
dbc0: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
dbd0: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
dbe0: 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e1;.        pPag
dbf0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
dc00: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
dc10: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
dc20: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
dc30: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
dc40: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
dc50: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  1;.      }.#endi
dc60: 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  f.      releaseP
dc70: 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
dc80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
dc90: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
dca0: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
dcb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
dcc0: 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
dcd0: 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
dce0: 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
dcf0: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
dd00: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
dd10: 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
dd20: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
dd30: 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
dd40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
dd50: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
dd60: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
dd70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dd80: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
dd90: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
dda0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
ddb0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
ddc0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
ddd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dde0: 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
ddf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
de00: 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
de10: 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
de20: 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
de30: 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
de40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
de50: 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
de60: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
de70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
de80: 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
de90: 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
dea0: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
deb0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
dec0: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
ded0: 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
dee0: 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
def0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
df00: 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
df10: 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64  ata[19] = 1;.  d
df20: 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70  ata[20] = pBt->p
df30: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
df40: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
df50: 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
df60: 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
df70: 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
df80: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
df90: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
dfa0: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
dfb0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
dfc0: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
dfd0: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
dfe0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
dff0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e000: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
e010: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
e020: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
e030: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
e040: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
e050: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
e060: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e070: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
e080: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
e090: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
e0a0: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
e0b0: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
e0c0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e0d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
e0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e0f0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
e100: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
e110: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
e120: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
e130: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
e140: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e150: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
e160: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
e170: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
e180: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
e190: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
e1a0: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
e1b0: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
e1c0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
e1d0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
e1e0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
e1f0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
e200: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
e210: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
e220: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
e230: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
e240: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
e250: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
e260: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
e270: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
e280: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
e290: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
e2a0: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
e2b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
e2c0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
e2d0: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
e2e0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
e2f0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
e300: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
e310: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
e320: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e330: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
e340: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
e350: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
e360: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
e370: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e380: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
e390: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e3a0: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
e3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e3c0: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
e3d0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e3e0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
e3f0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e400: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e410: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e420: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e440: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e450: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e460: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e470: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e480: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e490: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e4a0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e4b0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e4c0: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e4d0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e4e0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e4f0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e500: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e510: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e520: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e530: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e540: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e550: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e560: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e570: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e580: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e590: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e5a0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e5b0: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e5c0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e5d0: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e5e0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e5f0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e600: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e610: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e620: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e630: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
e640: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
e650: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
e660: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
e670: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e680: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
e690: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
e6a0: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
e6b0: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
e6c0: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
e6d0: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
e6e0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
e6f0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
e700: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
e710: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
e720: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
e730: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
e740: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
e750: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
e760: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
e770: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
e780: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
e790: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
e7a0: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
e7b0: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
e7c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e7d0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
e7f0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e800: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
e810: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
e820: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
e830: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
e840: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
e850: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e860: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
e870: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
e880: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
e890: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
e8a0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
e8b0: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
e8c0: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
e8d0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
e8e0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
e8f0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e900: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
e910: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
e920: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e930: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
e940: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
e950: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
e960: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
e970: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
e980: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
e990: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
e9a0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e9b0: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
e9c0: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
e9d0: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
e9e0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
e9f0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
ea00: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
ea10: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
ea20: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
ea30: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
ea40: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
ea50: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
ea60: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
ea70: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
ea80: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
ea90: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
eaa0: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
eab0: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
eac0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
ead0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
eae0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
eaf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
eb00: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
eb10: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
eb20: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
eb30: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
eb40: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
eb50: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
eb60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
eb70: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
eb80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
eb90: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
eba0: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
ebb0: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
ebc0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
ebd0: 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74  do {.    if( pBt
ebe0: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
ebf0: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
ec00: 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28   rc = lockBtree(
ec10: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  pBt);.      }whi
ec20: 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
ec30: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
ec40: 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  _OK );.    }..  
ec50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ec60: 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
ec70: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
ec80: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
ec90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eca0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
ecb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
ecc0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ecd0: 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
ece0: 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c  1->pDbPage, wrfl
ecf0: 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ag>1);.        i
ed00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ed10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
ed20: 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
ed30: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
ed40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
ed50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ed60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
ed70: 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d  f( wrflag ) pBt-
ed80: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
ed90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
eda0: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
edb0: 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
edc0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
edd0: 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
ede0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
edf0: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
ee00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
ee10: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
ee20: 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a  dler(pBt, 0) );.
ee30: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ee40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
ee50: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
ee60: 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
ee70: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
ee80: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n++;.    }.    p
ee90: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
eea0: 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
eeb0: 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
eec0: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
eed0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
eee0: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
eef0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
ef00: 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
ef10: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ef20: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ef30: 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c  CHE.    if( wrfl
ef40: 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73  ag>1 ){.      as
ef50: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63  sert( !pBt->pExc
ef60: 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20  lusive );.      
ef70: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
ef80: 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = p;.    }.#endi
ef90: 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
efa0: 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65  gun:.  btreeInte
efb0: 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
efc0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
efd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
efe0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eff0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f000: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f010: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
f020: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
f030: 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
f040: 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
f050: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
f060: 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
f070: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
f080: 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
f090: 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
f0a0: 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
f0b0: 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
f0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f0d0: 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
f0e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
f0f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
f120: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
f130: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
f160: 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
f170: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f1a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
f1b0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f1c0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
f1d0: 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
f1e0: 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
f1f0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
f200: 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
f210: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f220: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f230: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
f240: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
f250: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
f260: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  Page->pParent);.
f270: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
f290: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f2a0: 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
f2b0: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
f2c0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
f2d0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
f2e0: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
f2f0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
f300: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
f310: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
f320: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
f330: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f340: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f350: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f360: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
f370: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f380: 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
f390: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
f3a0: 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
f3b0: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f3c0: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
f3d0: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
f3e0: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 69   pgno);.       i
f3f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f400: 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
f410: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
f420: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f430: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
f440: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
f450: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
f460: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
f470: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
f480: 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
f490: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
f4a0: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
f4b0: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
f4c0: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
f4d0: 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
f4e0: 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
f4f0: 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
f500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
f510: 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
f520: 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
f530: 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
f540: 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
f550: 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
f560: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
f570: 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
f580: 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
f590: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f5a0: 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
f5b0: 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
f5c0: 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
f5d0: 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
f5e0: 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
f5f0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
f600: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
f610: 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
f620: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
f630: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
f640: 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
f660: 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
f670: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
f680: 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
f690: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
f6a0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
f6b0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
f6e0: 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
f6f0: 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
f700: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
f710: 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
f720: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
f730: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
f740: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
f750: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
f760: 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
f770: 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
f780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f790: 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
f7a0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
f7b0: 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
f7c0: 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
f7d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
f7e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f7f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f800: 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  x) );.  if( eTyp
f810: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
f820: 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
f830: 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
f840: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
f850: 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
f860: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
f870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
f880: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
f890: 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
f8a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f8b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f8c0: 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
f8d0: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
f8e0: 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
f8f0: 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69     int isInitOri
f900: 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
f910: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
f920: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
f930: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
f940: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
f950: 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
f960: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
f970: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
f980: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
f990: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
f9a0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
f9b0: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
f9c0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
f9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
f9e0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
f9f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
fa00: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
fa10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
fa20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
fa30: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
fa40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
fa50: 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
fa60: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
fa70: 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
fa80: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
fa90: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
faa0: 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
fab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fac0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fad0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
fae0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
faf0: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
fb00: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
fb10: 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
fb20: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
fb30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fb40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fb50: 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
fb60: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
fb70: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
fb80: 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
fb90: 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
fba0: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
fbb0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
fbc0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
fbd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbe0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
fbf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
fc00: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
fc10: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
fc20: 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
fc30: 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
fc40: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
fc50: 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
fc60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fc70: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
fc80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
fc90: 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
fca0: 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
fcb0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
fcc0: 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
fcd0: 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
fce0: 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
fcf0: 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
fd00: 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
fd10: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
fd20: 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
fd30: 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
fd40: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
fd50: 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
fd60: 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fd80: 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
fd90: 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
fda0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
fdb0: 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
fdc0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
fdd0: 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
fde0: 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
fdf0: 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
fe00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fe10: 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
fe20: 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
fe30: 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
fe40: 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
fe50: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
fe60: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
fe70: 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
fe80: 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
fe90: 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
fea0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
feb0: 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
fec0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
fed0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
fee0: 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
fef0: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
ff00: 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
ff10: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
ff20: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
ff30: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
ff40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ff50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ff60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
ff70: 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
ff80: 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
ff90: 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
ffa0: 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
ffb0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
ffc0: 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
ffd0: 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
ffe0: 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
fff0: 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
10000 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
10010 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
10020 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
10030 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
10040 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
10050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10060 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
10070 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
10080 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
10090 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
100a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
100b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
100c0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
100d0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
100e0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
100f0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
10100 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
10110 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
10120 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
10130 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
10140 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
10150 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
10160 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
10170 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
10180 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
10190 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
101a0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
101b0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
101c0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
101d0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
101e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
101f0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
10200 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
10210 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
10220 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
10230 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
10240 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
10250 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
10260 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
10270 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
10280 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
10290 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
102a0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
102b0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
102c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
102d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
102e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
102f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
10300 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
10310 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
10320 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
10330 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
10340 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
10350 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
10360 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
10370 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
10380 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
10390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
103a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
103b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
103c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
103d0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
103e0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
103f0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
10400 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
10410 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
10420 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
10430 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
10440 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
10450 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
10460 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
10470 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
10480 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
104a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
104b0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
104c0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
104d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
104e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
104f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
10500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10510 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
10520 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
10530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10540 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
10550 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
10560 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10570 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
10580 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
10590 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
105a0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
105b0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
105c0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
105d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
105e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
105f0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
10600 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
10610 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
10620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
10640 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
10650 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
10660 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
10670 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72    int nPage;.  r
10680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10690 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
106a0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  , &nPage);.  ret
106b0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
106c0 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a  OK?nPage:-1);.}.
106d0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
106e0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
106f0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
10700 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
10710 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
10720 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
10730 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
10740 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
10750 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
10760 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
10770 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
10780 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
10790 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
107a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
107b0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
107c0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
107d0 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
107e0 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
107f0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
10800 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10810 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
10820 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
10830 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
10840 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
10850 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
10860 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
10870 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
10880 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
10890 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
108a0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
108b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
108c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
108d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c  n-zero, the impl
108e0 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d  ementation assum
108f0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
10900 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
10910 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
10920 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
10930 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
10940 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
10950 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
10960 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
10970 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
10980 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10990 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
109a0 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
109b0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
109c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
109d0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
109e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
109f0 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20  o nFin){.  Pgno 
10a00 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20 20  iLastPg;        
10a10 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67       /* Last pag
10a20 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
10a30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65  e */.  Pgno nFre
10a40 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
10a50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
10a60 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
10a70 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
10a80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10aa0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61  >mutex) );.  iLa
10ab0 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75  stPg = pBt->nTru
10ac0 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50  nc;.  if( iLastP
10ad0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  g==0 ){.    iLas
10ae0 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  tPg = pagerPagec
10af0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10b00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50  );.  }..  if( !P
10b10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
10b20 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
10b30 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
10b40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
10b50 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
10b60 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
10b70 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
10b80 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
10b90 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
10ba0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
10bb0 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
10bc0 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d  ist==0 || nFin==
10bd0 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20  iLastPg ){.     
10be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10bf0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10c00 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
10c10 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
10c20 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
10c30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10c50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10c60 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
10c70 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
10c80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10c90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10ca0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
10cb0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
10cc0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
10cd0 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
10ce0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
10cf0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
10d00 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
10d10 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
10d20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
10d30 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
10d40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
10d50 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
10d60 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
10d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
10d80 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
10d90 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10da0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
10db0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
10dc0 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
10dd0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
10de0 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
10df0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
10e00 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
10e10 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10e20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
10e30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
10e40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
10e50 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
10e60 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
10e70 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
10e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
10ea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10eb0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
10ec0 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
10ed0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
10ee0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
10ef0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
10f00 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
10f10 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
10f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10f30 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
10f40 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
10f50 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
10f60 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
10f70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10f80 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
10f90 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
10fa0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
10fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10fe0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
10ff0 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
11000 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
11010 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
11020 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
11030 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
11040 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
11050 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
11060 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
11070 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
11080 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
11090 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
110a0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
110b0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
110c0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
110d0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
110e0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
110f0 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
11100 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
11110 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
11120 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11130 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
11140 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
11150 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
11160 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
11170 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
11180 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
11190 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
111a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
111c0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
111d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
111e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
111f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
11200 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
11210 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
11220 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
11230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11240 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
11250 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
11260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11270 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
11280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
11290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
112a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
112b0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
112c0 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
112d0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
112e0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
112f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11300 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
11310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
11330 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11340 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
11350 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61  Bt->nTrunc = iLa
11360 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c  stPg - 1;.  whil
11370 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d  e( pBt->nTrunc==
11380 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
11390 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
113a0 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
113b0 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70  nTrunc) ){.    p
113c0 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20  Bt->nTrunc--;.  
113d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
113e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
113f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11400 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
11410 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
11420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11430 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
11440 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
11450 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
11460 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
11470 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
11480 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
11490 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
114a0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
114b0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
114c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
114d0 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
114e0 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
114f0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
11500 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ured,.** SQLITE_
11510 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
11520 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
11530 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
11540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11550 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
11560 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
11570 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
11580 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
11590 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
115a0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
115b0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
115c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
115d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
115e0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
115f0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
11600 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
11610 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
11620 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
11630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11640 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
11650 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
11660 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
11670 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b  uumStep(pBt, 0);
11680 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
11690 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
116a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
116b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
116c0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
116d0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
116e0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
116f0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
11700 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
11710 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
11720 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
11730 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11740 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
11750 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
11760 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
11770 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
11780 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
11790 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
117a0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
117b0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
117c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
117d0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
117e0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
117f0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
11800 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
11810 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
11820 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
11830 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
11840 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72  *pBt, Pgno *pnTr
11850 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
11860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
11870 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
11880 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64  t->pPager;.#ifnd
11890 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
118a0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
118b0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
118c0 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  er);.#endif..  a
118d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
118e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
118f0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
11900 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
11910 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
11920 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
11930 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
11940 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
11950 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
11960 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74   0;..    if( pBt
11970 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20  ->nTrunc==0 ){. 
11980 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b       Pgno nFree;
11990 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  .      Pgno nPtr
119a0 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  map;.      const
119b0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
119c0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
119d0 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61 67   int nOrig = pag
119e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
119f0 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  >pPager);..     
11a00 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
11a10 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29  GE(pBt, nOrig) )
11a20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11a30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11a40 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
11a50 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50      if( nOrig==P
11a60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11a70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11a80 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20   nOrig--;.      
11a90 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
11aa0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
11ab0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11ac0 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70  );.      nPtrmap
11ad0 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
11ae0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
11af0 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
11b00 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
11b10 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
11b20 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
11b30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  ;.      if( nOri
11b40 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
11b50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
11b60 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
11b70 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11b80 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
11b90 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
11ba0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
11bb0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
11bc0 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
11bd0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11be0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11c00 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
11c20 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11c30 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20  p(pBt, nFin);.  
11c40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11c50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
11c60 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e       assert(nFin
11c70 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75  ==0 || pBt->nTru
11c80 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70  nc==0 || nFin<=p
11c90 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20  Bt->nTrunc);.   
11ca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11cb0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  K;.      if( pBt
11cc0 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69 6e  ->nTrunc && nFin
11cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11cf0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
11d00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
11d10 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
11d20 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
11d30 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  2], 0);.        
11d40 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
11d50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11d60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  , 0);.        pB
11d70 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e  t->nTrunc = nFin
11d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11db0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
11dc0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11dd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
11de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11df0 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42     *pnTrunc = pB
11e00 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70  t->nTrunc;.    p
11e10 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  Bt->nTrunc = 0;.
11e20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11e30 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
11e40 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
11e50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11e60 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
11e70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
11e80 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
11e90 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
11ea0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
11eb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
11ec0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
11ed0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
11ee0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
11ef0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
11f00 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
11f10 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
11f20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
11f30 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
11f40 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
11f50 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
11f60 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
11f70 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
11f80 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
11f90 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
11fa0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
11fb0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
11fc0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
11fd0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
11fe0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
11ff0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
12000 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
12010 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
12020 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
12030 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
12040 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
12050 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
12060 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
12070 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
12080 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
12090 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
120a0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
120b0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
120c0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
120d0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
120e0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
120f0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
12100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12110 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
12120 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
12130 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
12140 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
12150 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
12160 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
12170 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
12180 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
12190 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
121a0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
121b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
121c0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
121d0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
121e0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
121f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12200 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
12210 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
12220 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
12230 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
12240 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
12250 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
12260 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
12270 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
12280 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
12290 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
122a0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
122b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
122c0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
122d0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
122e0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
122f0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
12300 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
12310 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
12320 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
12330 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
12340 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
12350 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
12360 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
12370 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12380 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
12390 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
123a0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
123b0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
123c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
123d0 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
123e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
123f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
12400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
12410 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
12420 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
12430 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12440 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f  p->pBt;.    Pgno
12450 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20   nTrunc = 0;.   
12460 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12470 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  er(p);.    pBt->
12480 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e  db = p->db;.#ifn
12490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
124b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
124c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
124d0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
124e0 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b  t(pBt, &nTrunc);
124f0 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d   .      if( rc!=
12500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12510 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12520 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
12530 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12540 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
12550 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
12560 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12570 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
12580 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  er, zMaster, nTr
12590 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  unc, 0);.    sql
125a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
125b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
125c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
125d0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
125e0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
125f0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
12600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
12610 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
12620 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
12630 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
12640 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
12650 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
12660 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
12670 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
12680 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  d be invoked.** 
12690 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
126a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
126b0 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
126c0 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64  Sync() routine d
126d0 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f  id.** all the wo
126e0 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
126f0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
12700 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
12710 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
12720 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
12730 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
12740 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
12750 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
12760 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
12770 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
12780 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c 6c  runcate the roll
12790 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  back journal.** 
127a0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
127b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
127c0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f   commit) and dro
127d0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
127e0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
127f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
12800 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
12810 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
12820 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
12830 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
12840 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
12850 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
12860 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12870 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
12880 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
12890 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
128a0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
128b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
128c0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62  >db = p->db;.  b
128d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
128e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
128f0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
12900 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
12910 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
12920 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
12930 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
12940 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
12950 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
12960 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
12970 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12980 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12990 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
129a0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
129b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
129c0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
129d0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
129e0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
129f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12a00 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
12a10 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
12a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
12a40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12a50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12a60 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
12a70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
12a80 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
12a90 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
12aa0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
12ab0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
12ac0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
12ad0 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
12ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12af0 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
12b00 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
12b10 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
12b20 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
12b30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12b40 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
12b50 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
12b60 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
12b70 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
12b80 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12b90 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
12ba0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
12bb0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
12bc0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12bd0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
12be0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
12bf0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
12c00 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
12c10 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
12c20 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12c30 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
12c40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12c50 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
12c60 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
12c70 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
12c80 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
12c90 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
12ca0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
12cb0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
12cc0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
12cd0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
12ce0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12cf0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
12d00 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
12d10 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
12d20 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
12d30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12d40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
12d50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12d60 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
12d70 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
12d80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12d90 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
12da0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
12db0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12dc0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
12dd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12de0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
12df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12e00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12e10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12e20 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a  haseTwo(p);.  }.
12e30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12e40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12e50 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
12e60 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
12e70 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
12e80 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
12e90 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
12ea0 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
12eb0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
12ec0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
12ed0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
12ee0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
12ef0 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
12f00 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
12f10 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
12f20 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
12f30 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
12f40 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
12f50 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
12f60 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
12f70 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
12f80 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
12f90 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
12fa0 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
12fb0 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
12fc0 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
12fd0 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
12fe0 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
12ff0 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
13000 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
13010 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
13020 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
13030 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
13040 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
13050 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
13060 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
13070 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
13080 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
13090 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
130a0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
130b0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
130c0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
130d0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
130e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
130f0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
13100 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
13110 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
13120 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
13130 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
13140 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
13150 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
13160 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
13170 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
13180 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
13190 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
131a0 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
131b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
131c0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
131d0 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
131e0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
131f0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
13200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
13210 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
13220 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
13230 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
13240 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
13250 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
13260 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
13270 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
13280 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
13290 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
132a0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
132b0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
132c0 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
132d0 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
132e0 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
132f0 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
13300 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
13310 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
13320 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
13330 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
13340 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
13350 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
13360 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
13370 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
13380 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
13390 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rsor *p;.  sqlit
133a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
133b0 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
133c0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
133d0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
133e0 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72  t){.    clearCur
133f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
13400 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
13410 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
13420 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
13430 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ode;.  }.  sqlit
13440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
13450 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
13460 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
13470 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
13480 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
13490 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
134a0 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
134b0 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
134c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
134d0 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
134e0 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
134f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
13500 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
13510 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
13520 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
13530 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
13540 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
13550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13560 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
13570 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
13580 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
13590 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
135a0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
135b0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
135c0 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
135d0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
135e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
135f0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
13600 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
13610 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13620 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13630 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ;.  rc = saveAll
13640 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
13650 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
13660 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13670 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
13680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13690 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
136a0 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
136b0 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
136c0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  () error occured
136d0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
136e0 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
136f0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
13700 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
13710 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
13720 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
13730 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
13740 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
13750 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
13760 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
13770 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
13780 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
13790 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
137a0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
137b0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
137c0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
137d0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
137e0 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
137f0 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
13800 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
13810 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
13820 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
13830 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
13840 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
13850 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
13860 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
13870 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
13880 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
13890 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e  tegrity(p);.  un
138a0 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
138b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
138c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
138d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
138e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
138f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13900 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
13910 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
13920 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
13930 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
13940 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
13950 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
13960 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
13970 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
13980 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
13990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
139a0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
139b0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
139c0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
139d0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
139e0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
139f0 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74     ** call sqlit
13a00 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29  e3BtreeGetPage()
13a10 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
13a20 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
13a30 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
13a40 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
13a50 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
13a60 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
13a70 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
13a80 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
13a90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13aa0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
13ab0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
13ac0 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
13ad0 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
13ae0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13af0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
13b00 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
13b10 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13b20 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  S_NONE ){.    as
13b30 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
13b40 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
13b50 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13b60 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
13b70 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
13b80 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
13b90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13ba0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
13bb0 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54   }.  }..  p->inT
13bc0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
13bd0 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  E;.  pBt->inStmt
13be0 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74   = 0;.  unlockBt
13bf0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
13c00 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
13c10 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
13c20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13c40 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
13c50 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
13c60 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62  action.  The sub
13c70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a  transaction can.
13c80 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
13c90 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
13ca0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
13cb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13cc0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
13cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
13ce0 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
13cf0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  ubtransaction..*
13d00 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  * The subtransac
13d10 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
13d20 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74  tomatically if t
13d30 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
13d40 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f  ion.** commits o
13d50 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
13d60 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62  .** Only one sub
13d70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
13d80 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74  be active at a t
13d90 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ime.  It is an e
13da0 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74  rror to try.** t
13db0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75  o start a new su
13dc0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20  btransaction if 
13dd0 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73  another subtrans
13de0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
13df0 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  y active..**.** 
13e00 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
13e10 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
13e20 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
13e30 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
13e40 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
13e50 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
13e60 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
13e70 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
13e80 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
13e90 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
13ea0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
13eb0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
13ec0 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
13ed0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13ee0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
13ef0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
13f00 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
13f10 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
13f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
13f30 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  inStmt(Btree *p)
13f40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
13f50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13f60 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
13f70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13f80 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13f90 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61  .  if( (p->inTra
13fa0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns!=TRANS_WRITE)
13fb0 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20   || pBt->inStmt 
13fc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
13fd0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
13fe0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
13ff0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
14000 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
14010 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14020 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
14030 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   );.    rc = pBt
14040 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
14050 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
14060 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
14070 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
14080 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31   pBt->inStmt = 1
14090 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
140a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
140b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
140c0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
140d0 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e  statment subtran
140e0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
140f0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  y in progress.  
14100 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e  If no.** subtran
14110 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
14120 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  e, this is a no-
14130 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
14140 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
14150 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14160 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
14170 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14180 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14190 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
141a0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
141b0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
141c0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
141d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
141e0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
141f0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
14200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
14210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14220 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
14230 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
14240 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14260 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
14270 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
14280 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
14290 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
142a0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
142b0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
142c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
142d0 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
142e0 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
142f0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
14300 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
14310 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
14320 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
14330 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
14340 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
14350 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
14360 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
14370 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
14380 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
14390 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
143a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
143b0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
143c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
143d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
143e0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
143f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
14400 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
14410 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
14420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14430 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
14440 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
14450 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
14460 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
14470 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14490 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
144a0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
144b0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
144c0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
144d0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
144e0 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
144f0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
14500 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
14510 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
14520 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
14530 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
14540 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
14550 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
14560 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
14570 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
14580 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
14590 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
145a0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
145b0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
145c0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
145d0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
145e0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
145f0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
14600 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
14610 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
14620 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
14630 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
14640 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
14650 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
14660 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
14670 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
14680 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
14690 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
146a0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
146b0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
146c0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
146d0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
146e0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
146f0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
14700 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
14710 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
14720 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
14730 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
14740 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
14750 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
14760 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
14770 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
14780 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
14790 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
147a0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
147b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
147c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
147d0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
147e0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
147f0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
14800 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
14810 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
14820 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
14830 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
14840 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
14850 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
14860 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
14870 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
14880 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
14890 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
148a0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
148b0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
148c0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
148d0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
148e0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
148f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14910 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
14920 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
14950 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
14960 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
14970 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
149a0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
149b0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
149c0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
149d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
149e0 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
149f0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
14a00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
14a30 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
14a40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14a50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14a60 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
14a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
14a80 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
14a90 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  );.  if( wrFlag 
14aa0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ){.    if( pBt->
14ab0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
14ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ad0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
14ae0 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61      if( checkRea
14af0 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65  dLocks(p, iTable
14b00 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
14b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
14b20 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OCKED;.    }.  }
14b30 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ..  if( pBt->pPa
14b40 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ge1==0 ){.    rc
14b50 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68   = lockBtreeWith
14b60 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66  Retry(p);.    if
14b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14b80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14b90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
14ba0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
14bb0 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  && wrFlag ){.   
14bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14bd0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14be0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
14bf0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
14c00 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
14c10 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61  le==1 && pagerPa
14c20 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
14c30 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ger)==0 ){.    r
14c40 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
14c50 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
14c60 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
14c70 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  on;.  }.  rc = g
14c80 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
14c90 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
14ca0 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
14cb0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
14cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14cd0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
14ce0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
14cf0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
14d00 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
14d10 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
14d20 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
14d30 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
14d40 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
14d50 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
14d60 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
14d70 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
14d80 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
14d90 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
14da0 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
14db0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  */.  pCur->pKeyI
14dc0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
14dd0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
14de0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
14df0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
14e00 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a  rFlag = wrFlag;.
14e10 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
14e20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
14e30 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
14e40 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
14e50 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
14e60 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
14e70 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
14e80 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
14e90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20  RSOR_INVALID;.. 
14ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14eb0 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
14ec0 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72  r_exception:.  r
14ed0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
14ee0 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63  >pPage);.  unloc
14ef0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
14f00 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Bt);.  return rc
14f10 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
14f20 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
14f30 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14f60 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
14f70 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
14fa0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
14fb0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
14fc0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
14ff0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
15000 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
15010 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
15040 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
15050 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
15060 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15080 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
15090 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
150a0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
150b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
150c0 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
150d0 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
150e0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
150f0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
15100 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
15110 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15120 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15130 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
15140 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
15150 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f  {.  return sizeo
15160 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  f(BtCursor);.}..
15170 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
15180 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
15190 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
151a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
151b0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
151c0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
151d0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
151e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
151f0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
15200 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
15210 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
15220 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
15230 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42   pBtree ){.    B
15240 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15250 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
15260 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15270 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74  pBtree);.    pBt
15280 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64  ->db = pBtree->d
15290 62 3b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73  b;.    clearCurs
152a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
152b0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
152c0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
152d0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
152e0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
152f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15300 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
15310 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15320 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
15330 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
15340 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
15350 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
15360 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  v;.    }.    rel
15370 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
15380 50 61 67 65 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  Page);.    unloc
15390 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
153a0 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
153b0 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
153c0 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
153d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
153e0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
153f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
15400 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
15410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15420 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
15430 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
15440 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
15450 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
15460 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
15470 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
15480 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
15490 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
154a0 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
154b0 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
154c0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
154d0 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20  *pCur, BtCursor 
154e0 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73  *pTempCur){.  as
154f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
15500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
15510 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75    memcpy(pTempCu
15520 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28  r, pCur, sizeof(
15530 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70  *pCur));.  pTemp
15540 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
15550 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
15560 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65  v = 0;.  if( pTe
15570 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a  mpCur->pPage ){.
15580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15590 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50  Ref(pTempCur->pP
155a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
155b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
155c0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
155d0 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
155e0 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
155f0 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
15600 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
15610 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
15620 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
15630 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
15640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15650 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
15660 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
15670 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
15680 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
15690 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
156a0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
156b0 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
156c0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
156d0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
156e0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
156f0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
15700 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
15710 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
15720 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
15730 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
15740 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15750 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
15760 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
15770 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
15780 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
15790 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
157a0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
157b0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
157c0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
157d0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
157e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
157f0 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
15800 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
15810 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
15820 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
15830 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
15840 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
15850 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
15860 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
15870 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
15880 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
15890 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
158a0 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
158b0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
158c0 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
158d0 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
158e0 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
158f0 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
15900 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
15910 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
15920 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
15930 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
15940 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
15950 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
15960 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
15970 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
15980 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
15990 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
159a0 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
159b0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
159c0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
159d0 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
159e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d  Info info;.    m
159f0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
15a00 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
15a10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
15a20 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
15a30 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
15a40 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
15a50 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
15a60 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
15a70 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
15a80 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
15a90 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
15aa0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
15ab0 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
15ac0 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
15ad0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
15ae0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
15af0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
15b00 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
15b10 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
15b20 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
15b30 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
15b40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
15b50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15b60 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15b70 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15b80 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15b90 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
15ba0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
15bb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15bc0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
15bd0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
15be0 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
15bf0 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
15c00 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
15c10 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
15c20 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
15c30 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
15c40 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
15c50 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
15c60 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
15ca0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15ce0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
15cf0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
15d00 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
15d10 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20  &pCur->info);   
15d20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72        \.    pCur
15d30 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
15dc0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
15dd0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
15e10 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
15e20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
15e30 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
15e40 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
15e50 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
15e60 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
15e70 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
15e80 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
15e90 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
15ea0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
15eb0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
15ec0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
15ed0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
15ee0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
15ef0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
15f00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
15f10 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
15f20 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
15f30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
15f40 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
15f50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
15f60 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
15f70 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
15f80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
15f90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
15fa0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
15fb0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
15fc0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15fd0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15ff0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
16000 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16010 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
16020 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16030 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
16040 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16050 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
16060 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
16070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16080 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
16090 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
160a0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
160b0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
160c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
160d0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
160e0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
160f0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
16100 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
16110 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
16120 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
16130 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
16140 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
16150 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
16160 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
16170 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
16180 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
16190 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
161a0 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
161b0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
161c0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
161d0 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
161e0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
161f0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
16200 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
16210 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
16220 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
16230 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16240 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
16250 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
16260 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
16270 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
16280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16290 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
162a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
162b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
162c0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
162d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
162e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
162f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
16300 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ALID ){.      /*
16310 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   Not pointing at
16320 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d   a valid entry -
16330 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30   set *pSize to 0
16340 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a  . */.      *pSiz
16350 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
16360 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
16370 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
16380 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
16390 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
163a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
163b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
163c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
163d0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
163e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
163f0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
16400 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
16410 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
16420 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16430 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
16440 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
16450 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
16460 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
16470 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
16480 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
16490 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
164a0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
164b0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
164c0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
164d0 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
164e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
164f0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
16500 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
16510 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
16520 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67  **.** Unless pPg
16530 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20  noNext is NULL, 
16540 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16550 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
16560 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e  flow .** page in
16570 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
16580 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
16590 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
165a0 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68  ge ovfl.** is th
165b0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
165c0 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20  ts linked list, 
165d0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
165e0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
165f0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
16600 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65  ot NULL, *ppPage
16610 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d   is set to the M
16620 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a  emPage* handle.*
16630 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e  * for page ovfl.
16640 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
16650 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68  pager page may h
16660 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
16670 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e  ed.** with the n
16680 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65  oContent flag se
16690 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64  t, so the page d
166a0 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76  ata accessable v
166b0 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  ia.** this handl
166c0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  e may not be tru
166d0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
166e0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
166f0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
16700 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76  *pBt, .  Pgno ov
16710 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
16720 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f        /* Overflo
16730 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  w page */.  MemP
16740 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
16750 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16760 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
16770 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
16780 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
16790 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
167a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
167b0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
167c0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74   next = 0;.  int
167d0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
167e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
167f0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
16800 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;.  /* One of th
16810 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ese must not be 
16820 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
16830 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66   why call this f
16840 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73  unction? */.  as
16850 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70  sert(ppPage || p
16860 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a  PgnoNext);..  /*
16870 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73   If pPgnoNext is
16880 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
16890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
168a0 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  ng called to obt
168b0 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61  ain.  ** a MemPa
168c0 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  ge* reference on
168d0 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61  ly. No page-data
168e0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
168f0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  this case..  */.
16900 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74    if( !pPgnoNext
16910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
16920 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
16930 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70  ge(pBt, ovfl, pp
16940 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23  Page, 1);.  }..#
16950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16970 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
16980 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16990 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
169a0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
169b0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
169c0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
169d0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
169e0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
169f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
16a00 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
16a10 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
16a20 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
16a30 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
16a40 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
16a50 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
16a60 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
16a70 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
16a80 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16a90 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
16aa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
16ab0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16ac0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
16ad0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
16ae0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
16af0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
16b00 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
16b10 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
16b20 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
16b30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16b40 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
16b50 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
16b60 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
16b70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
16b80 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
16b90 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
16ba0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
16bb0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
16bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
16bf0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
16c00 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
16c10 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
16c20 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
16c30 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
16c40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
16c50 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d  dif..  if( next=
16c60 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a  =0 || ppPage ){.
16c70 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
16c80 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  ge = 0;..    rc 
16c90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
16ca0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
16cb0 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30   &pPage, next!=0
16cc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  );.    assert(rc
16cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
16ce0 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66  Page==0);.    if
16cf0 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d  ( next==0 && rc=
16d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16d10 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
16d20 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
16d40 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
16d50 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
16d60 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
16d70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16d80 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
16d90 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  }.  *pPgnoNext =
16da0 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e   next;..  return
16db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
16dc0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
16dd0 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
16de0 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
16df0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
16e00 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
16e10 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
16e20 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
16e30 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
16e40 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
16e50 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
16e60 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
16e70 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
16e80 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
16e90 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
16ea0 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
16eb0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
16ec0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
16ed0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16ee0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
16ef0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
16f00 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
16f10 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
16f20 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
16f30 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
16f40 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
16f50 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
16f60 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
16f70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
16f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
16f90 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
16fa0 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
16fb0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16fc0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
16fd0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ff0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
17000 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
17010 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17030 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
17040 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
17050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
17060 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
17070 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
17080 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
17090 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
170a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
170b0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
170c0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
170d0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
170e0 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
170f0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
17100 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
17110 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
17120 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17130 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
17140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17150 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17160 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
17170 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
17180 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
17190 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
171a0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
171b0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
171c0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
171d0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
171e0 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
171f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17210 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17220 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
17230 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
17240 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
17250 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
17260 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
17270 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
17280 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
17290 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
172a0 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
172b0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
172c0 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
172d0 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
172e0 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
172f0 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
17300 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
17310 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
17320 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
17330 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
17340 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
17350 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
17360 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
17370 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
17380 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
17390 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
173a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
173b0 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
173c0 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
173d0 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
173e0 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
173f0 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
17400 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
17410 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
17420 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
17430 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
17440 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
17450 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
17460 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
17470 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
17480 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
17490 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
174a0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
174b0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
174c0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
174d0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
174e0 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
174f0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
17500 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
17510 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
17520 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17530 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
17540 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
17550 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
17560 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
17570 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
17580 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
17590 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
175a0 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
175b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
175c0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
175d0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
175e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
175f0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
17600 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
17610 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
17620 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
17630 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
17640 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
17650 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
17660 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
17670 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
17680 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
17690 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
176a0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
176b0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
176c0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
176d0 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
176e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
176f0 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
17700 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
17710 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
17720 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
17730 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
17740 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
17750 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
17760 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
17770 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
17780 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
17790 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
177a0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
177b0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
177c0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
177d0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
177e0 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
177f0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e   payload */.  in
17800 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
17810 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
17820 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
17830 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17840 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
17850 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
17860 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
17870 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
17880 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
17890 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
178a0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
178b0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
178c0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
178d0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
178e0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
178f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17900 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
17910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17920 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
17930 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
17940 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
17950 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20   pCur->pPage;   
17960 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20    /* Btree page 
17970 6f 66 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  of current curso
17980 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  r entry */.  BtS
17990 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
179b0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
179c0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
179d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
179e0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
179f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17a00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
17a10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
17a20 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
17a30 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
17a40 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
17a50 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
17a60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
17a70 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
17a80 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
17a90 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
17aa0 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
17ab0 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
17ac0 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
17ad0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
17ae0 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  0 : pCur->info.n
17af0 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69  Key);..  if( ski
17b00 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
17b10 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
17b20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
17b30 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
17b40 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  fo.nData ){.    
17b50 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
17b60 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
17b70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
17b80 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
17b90 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
17ba0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
17bb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
17bc0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
17bd0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
17be0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
17bf0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
17c00 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
17c10 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
17c20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
17c30 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
17c40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17c50 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
17c60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
17c70 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
17c80 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
17c90 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
17ca0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
17cb0 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
17cc0 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
17cd0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
17ce0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
17cf0 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
17d00 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
17d10 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
17d20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d  }..  pBt = pCur-
17d30 3e 70 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d  >pBt;.  if( rc==
17d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
17d50 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
17d60 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  int ovflSize = p
17d70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
17d80 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
17d90 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
17da0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
17db0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
17dc0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
17dd0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
17de0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
17df0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17e00 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
17e10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
17e20 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
17e30 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
17e40 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
17e50 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
17e60 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
17e70 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
17e80 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
17e90 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
17ea0 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
17eb0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
17ec0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
17ed0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
17ee0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
17ef0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
17f00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
17f10 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
17f20 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
17f30 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
17f40 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
17f50 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
17f60 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
17f70 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
17f80 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
17f90 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
17fa0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
17fb0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
17fc0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
17fd0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
17fe0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
17ff0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
18000 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
18010 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
18020 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
18030 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
18040 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
18050 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
18060 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
18070 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20     if( nOvfl && 
18080 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
18090 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
180a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
180b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
180c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
180d0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
180e0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
180f0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
18100 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
18110 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
18120 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
18130 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
18140 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
18150 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
18160 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
18170 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
18180 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
18190 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
181a0 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
181b0 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
181c0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
181d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
181e0 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
181f0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
18200 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
18210 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
18220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18230 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
18240 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
18250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18260 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18270 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
18280 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
18290 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
182a0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
182b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
182c0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
182d0 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
182e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
182f0 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
18300 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
18310 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
18320 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18330 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
18340 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
18350 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
18360 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
18370 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
18380 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
18390 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
183a0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
183b0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
183c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
183d0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
183e0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
183f0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
18400 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
18410 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
18420 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
18430 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
18440 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
18450 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
18460 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
18470 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
18480 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
18490 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
184a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
184b0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
184c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
184d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
184e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
184f0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
18500 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
18510 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
18520 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
18530 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
18540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
18550 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
18560 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
18570 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
18580 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
18590 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
185a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
185b0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
185c0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
185d0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
185e0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
185f0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
18600 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
18610 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
18620 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
18630 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
18640 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
18650 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
18660 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
18670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18680 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
18690 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
186a0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
186b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
186c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
186d0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
186e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
186f0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
18700 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
18710 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
18720 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
18730 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
18740 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
18750 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
18760 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
18770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18780 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
18790 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
187a0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
187b0 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
187c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
187d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
187e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
187f0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
18800 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
18810 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
18820 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
18830 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18840 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
18850 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
18860 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18870 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18880 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
18890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
188a0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
188b0 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
188c0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
188d0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
188e0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
188f0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
18900 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
18910 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
18920 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
18930 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
18940 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
18950 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
18960 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18970 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
18980 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
18990 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
189a0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
189b0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
189c0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
189d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
189e0 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
189f0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
18a00 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
18a10 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  f){.  int rc;.. 
18a20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
18a30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
18a40 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
18a50 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
18a60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
18a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18a90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18aa0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
18ab0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
18ac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
18ad0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18ae0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
18af0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18b00 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
18b10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18b20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Page->intKey==0 
18b30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18b40 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18b50 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18b60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18b70 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
18b80 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18b90 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
18ba0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
18bb0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18bd0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
18be0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
18bf0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18c00 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18c10 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18c20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18c30 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18c40 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18c50 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18c60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18c70 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18c80 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
18c90 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
18ca0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
18cb0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
18cc0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
18cd0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
18ce0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18cf0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18d00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18d10 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18d20 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18d30 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18d40 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
18d50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18d60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18d70 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
18d80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
18d90 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
18da0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
18db0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
18dc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
18dd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
18de0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
18df0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
18e00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
18e20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18e30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18e40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18e50 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18e70 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
18e80 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
18e90 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
18ea0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
18eb0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
18ec0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c  t, amt, pBuf, 1,
18ed0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
18ee0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18ef0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18f00 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
18f10 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
18f20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
18f30 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
18f40 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
18f50 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
18f60 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
18f70 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
18f80 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
18f90 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
18fa0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
18fb0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
18fc0 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
18fd0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
18fe0 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
18ff0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
19000 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
19010 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
19020 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19030 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
19040 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
19050 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19060 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
19070 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
19080 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
19090 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
190a0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
190b0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
190c0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
190d0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
190e0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
190f0 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
19100 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
19110 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
19120 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
19130 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
19140 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
19150 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
19160 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
19170 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
19180 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
19190 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
191a0 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a  to reassembly.**
191b0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
191c0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
191d0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
191e0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
191f0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
19200 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
19210 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
19220 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
19230 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
19240 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
19250 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
19260 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
19270 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
19280 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
19290 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
192a0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
192b0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
192c0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
192d0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
192e0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
192f0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
19300 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
19310 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
19320 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
19330 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
19340 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
19350 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
19360 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
19370 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
19380 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
19390 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
193a0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
193b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
193c0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
193d0 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  t nLocal;..  ass
193e0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
193f0 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
19400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19410 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19420 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
19430 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19440 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19450 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
19460 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
19470 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
19480 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
19490 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
194a0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
194b0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
194c0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
194d0 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
194e0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
194f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
19500 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
19510 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19520 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e   nKey = pCur->in
19530 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
19540 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
19550 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
19560 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
19570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
19580 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
19590 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
195a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
195b0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63  al;.    if( nLoc
195c0 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  al>nKey ){.     
195d0 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a   nLocal = nKey;.
195e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d      }.  }.  *pAm
195f0 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
19600 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
19610 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
19620 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
19630 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
19640 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
19650 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
19660 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
19670 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
19680 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
19690 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
196a0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
196b0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
196c0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
196d0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
196e0 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
196f0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
19700 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
19710 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
19720 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
19730 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
19740 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
19750 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
19760 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
19770 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
19780 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
19790 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
197a0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
197b0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
197c0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
197d0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
197e0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
197f0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
19800 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
19810 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
19820 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19830 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
19840 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
19850 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
19860 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
19870 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
19880 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
19890 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
198a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
198b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
198c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
198d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
198e0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
198f0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19900 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
19910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19920 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
19930 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
19940 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
19950 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
19960 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
19970 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
19980 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
19990 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
199a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
199b0 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
199c0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
199d0 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
199e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
199f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19a00 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
19a10 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
19a20 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
19a30 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
19a40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
19a50 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
19a60 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
19a70 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
19a80 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
19a90 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
19aa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
19ab0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
19ac0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c  ;.  MemPage *pOl
19ad0 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  dPage;.  BtShare
19ae0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
19af0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
19b00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19b10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
19b20 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19b30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19b40 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
19b50 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
19b60 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20  gno, &pNewPage, 
19b70 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
19b80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19b90 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e  rc;.  pNewPage->
19ba0 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72  idxParent = pCur
19bb0 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67  ->idx;.  pOldPag
19bc0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
19bd0 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78  .  pOldPage->idx
19be0 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c  Shift = 0;.  rel
19bf0 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67  easePage(pOldPag
19c00 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
19c10 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  e = pNewPage;.  
19c20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20  pCur->idx = 0;. 
19c30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
19c40 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
19c50 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
19c60 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
19c70 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
19c80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19c90 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
19ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19cc0 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
19cd0 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c  e is the virtual
19ce0 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62   root of its tab
19cf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  le..**.** The vi
19d00 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
19d10 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
19d20 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73   for most tables
19d30 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68  .  But.** for th
19d40 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f  e table rooted o
19d50 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69  n page 1, someti
19d60 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  me the real root
19d70 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74   page.** is empt
19d80 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  y except for the
19d90 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20   right-pointer. 
19da0 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
19db0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f  he.** virtual ro
19dc0 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  ot page is the p
19dd0 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67  age that the rig
19de0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61  ht-pointer of pa
19df0 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74  ge.** 1 is point
19e00 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
19e10 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
19e20 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
19e30 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
19e40 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73   *pParent;..  as
19e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19e60 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
19e70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19e80 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
19e90 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28  ->pParent;.  if(
19ea0 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65   pParent==0 ) re
19eb0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50  turn 1;.  if( pP
19ec0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20  arent->pgno>1 ) 
19ed0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19ee0 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e  get2byte(&pParen
19ef0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
19f00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
19f10 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19f20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19f30 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19f40 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
19f50 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
19f60 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19f70 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
19f80 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
19f90 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
19fa0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
19fb0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
19fc0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
19fd0 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
19fe0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
19ff0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
1a000 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
1a010 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
1a020 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
1a030 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
1a040 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1a050 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
1a060 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1a070 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d  ge *pParent;.  M
1a080 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1a090 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a   int idxParent;.
1a0a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a0b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a0c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a0d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a0e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
1a0f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a100 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
1a110 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
1a120 72 74 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  rt( !sqlite3Btre
1a130 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1a140 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  e) );.  pParent 
1a150 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
1a160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1a170 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50  ent!=0 );.  idxP
1a180 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69  arent = pPage->i
1a190 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69  dxParent;.  sqli
1a1a0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
1a1b0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
1a1c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1a1d0 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
1a1e0 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ge = pParent;.  
1a1f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a200 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1a210 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61  lidNKey = 0;.  a
1a220 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1a230 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
1a240 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
1a250 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
1a260 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a270 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1a280 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1a290 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1a2a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1a2b0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1a2c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a2d0 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
1a2e0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1a2f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a300 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
1a310 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a320 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a330 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
1a340 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
1a350 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1a360 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a370 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
1a380 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a390 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a3a0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
1a3b0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a3c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1a3d0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
1a3e0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
1a3f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1a400 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
1a410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
1a420 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
1a430 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
1a440 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1a450 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
1a460 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1a470 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
1a480 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1a490 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
1a4a0 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
1a4b0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1a4c0 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1a4d0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1a4e0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1a4f0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1a500 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
1a510 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
1a520 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1a530 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1a540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a550 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1a560 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
1a570 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
1a580 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
1a590 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
1a5a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a5b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
1a5c0 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
1a5d0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1a5e0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1a5f0 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1a600 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1a610 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
1a620 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1a630 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1a640 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1a650 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1a660 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1a670 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1a680 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1a690 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a6a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1a6b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a6c0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1a6d0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
1a6e0 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
1a6f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
1a700 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1a710 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1a720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a730 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a740 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1a750 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
1a760 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1a770 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
1a780 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1a790 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
1a7a0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
1a7b0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
1a7c0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
1a7d0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
1a7e0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
1a7f0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1a800 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
1a810 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
1a820 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1a830 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1a840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1a850 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1a860 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1a870 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1a880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1a890 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a8a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1a8b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1a8c0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1a8d0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1a8e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a8f0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1a900 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1a910 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1a920 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1a930 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1a940 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
1a950 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1a960 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1a970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a980 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a990 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1a9a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1a9b0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1a9c0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1a9d0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1a9e0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1a9f0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1aa00 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1aa10 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1aa20 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1aa30 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1aa40 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1aa50 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1aa60 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1aa70 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1aa80 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1aa90 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1aaa0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1aab0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1aac0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1aad0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1aae0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1aaf0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1ab00 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1ab10 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1ab20 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1ab30 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1ab40 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1ab50 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1ab60 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1ab70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1ab80 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1ab90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1aba0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1abb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1abc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1abd0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1abe0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1abf0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1ac00 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1ac10 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1ac20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1ac30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1ac40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1ac50 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1ac60 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1ac70 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ac80 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1ac90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1aca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1acb0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1acc0 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43  Cell - 1;.    pC
1acd0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1ace0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1acf0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
1ad00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ad10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
1ad20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1ad30 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1ad40 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1ad50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1ad60 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1ad70 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1ad80 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1ad90 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1ada0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1adb0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1adc0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1add0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1ade0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
1adf0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1ae00 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1ae10 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1ae20 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ae30 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1ae40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ae50 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1ae60 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1ae70 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1ae80 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1ae90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aea0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1aeb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1aec0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
1aed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1aee0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1aef0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1af00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1af10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1af20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1af30 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1af40 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
1af50 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1af60 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1af70 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
1af80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1af90 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1afa0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
1afb0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1afc0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1afd0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1afe0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1aff0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1b000 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1b010 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1b020 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1b030 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1b040 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1b050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b060 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
1b070 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1b080 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
1b090 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b0a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b0b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b0c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b0d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1b0e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b0f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1b100 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1b110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b120 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1b130 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1b140 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b150 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1b160 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1b170 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1b180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b190 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1b1a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1b1b0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b1c0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1b1d0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1b1e0 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43  Cur);.      getC
1b1f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1b200 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
1b210 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
1b220 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
1b230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1b240 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1b250 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1b260 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1b270 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1b280 70 65 63 69 66 69 65 64 20 62 79 20 70 4b 65 79  pecified by pKey
1b290 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52 65  /nKey/pUnKey. Re
1b2a0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1b2b0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1b2c0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e  NTKEY tables, on
1b2d0 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61  ly the nKey para
1b2e0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1b2f0 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55 6e  pKey .** and pUn
1b300 4b 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  Key must be NULL
1b310 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
1b320 6c 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e 4b  les, either pUnK
1b330 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e 74  ey.** must point
1b340 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 68   to a key that h
1b350 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b360 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c 73  unpacked, or els
1b370 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20 64  e.** pKey/nKey d
1b380 65 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62 20  escribes a blob 
1b390 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6b  containing the k
1b3a0 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ey..**.** If an 
1b3b0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1b3c0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1b3d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1b3e0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1b3f0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1b400 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1b410 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1b420 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1b430 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1b440 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1b450 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1b460 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1b470 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1b480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1b490 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1b4a0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1b4b0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1b4c0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1b4d0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1b4e0 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1b4f0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1b500 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1b510 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1b520 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1b530 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b540 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b550 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b560 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b570 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1b580 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1b590 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1b5a0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1b5b0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1b5c0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1b5d0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1b5e0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1b5f0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1b600 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1b610 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1b620 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1b650 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1b660 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1b670 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1b680 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b690 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1b6c0 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
1b6d0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1b6e0 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
1b6f0 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Cur,        /* T
1b700 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
1b710 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  moved */.  const
1b720 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
1b730 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e    /* The key con
1b740 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73  tent for indices
1b750 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74  .  Not used by t
1b760 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61 63  ables */.  Unpac
1b770 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b 65  kedRecord *pUnKe
1b780 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65  y,/* Unpacked ve
1b790 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a 2f  rsion of pKey */
1b7a0 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
1b7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b7c0 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74  e of pKey.  Or t
1b7d0 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  he key for table
1b7e0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  s */.  int biasR
1b7f0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ight,         /*
1b800 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
1b810 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
1b820 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1b830 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1b840 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
1b850 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29  result flag */.)
1b860 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1b870 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 0a  ar aSpace[200];.
1b880 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1b890 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1b8a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1b8b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b8c0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1b8d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
1b8e0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
1b8f0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
1b900 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
1b910 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
1b920 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
1b930 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
1b940 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
1b950 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
1b960 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b970 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1b980 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
1b990 65 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  ey && pCur->pPag
1b9a0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1b9b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1b9c0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20  nKey==nKey ){.  
1b9d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b9e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b9f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1ba00 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
1ba10 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
1ba20 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20  nKey<nKey ){.   
1ba30 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1ba40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ba50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1ba60 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  ...  rc = moveTo
1ba70 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1ba80 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1ba90 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1baa0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1bab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1bac0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
1bad0 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
1bae0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1baf0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1bb00 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1bb10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1bb20 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1bb30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bb40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1bb50 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1bb60 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  Key ){.    /* We
1bb70 20 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53 51   are given an SQ
1bb80 4c 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72 63  L table to searc
1bb90 68 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 74  h.  The key is t
1bba0 68 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a  he integer.    *
1bbb0 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e 65  * rowid containe
1bbc0 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65 79  d in nKey.  pKey
1bbd0 20 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f 75   and pUnKey shou
1bbe0 6c 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c 20  ld both be NULL 
1bbf0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1bc00 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  UnKey==0 );.    
1bc10 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30 20  assert( pKey==0 
1bc20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1bc30 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  UnKey==0 ){.    
1bc40 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65 61  /* We are to sea
1bc50 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  rch an SQL index
1bc60 20 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e 63   using a key enc
1bc70 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  oded as a blob..
1bc80 20 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62 20      ** The blob 
1bc90 69 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65 79  is found at pKey
1bca0 20 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79 74   and is nKey byt
1bcb0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20 55  es in length.  U
1bcc0 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68 69  npack.    ** thi
1bcd0 73 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77 65  s key so that we
1bce0 20 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f 0a   can use it. */.
1bcf0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1bd00 21 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b 65  !=0 );.    pUnKe
1bd10 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  y = sqlite3VdbeR
1bd20 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
1bd30 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79  ->pKeyInfo, nKey
1bd40 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd60 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63             aSpac
1bd70 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
1bd80 29 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 4b  ));.    if( pUnK
1bd90 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
1bda0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1bdb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
1bdc0 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e  are to search an
1bdd0 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67   SQL index using
1bde0 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61   a key that is a
1bdf0 6c 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64 0a  lready unpacked.
1be00 20 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64 65      ** and hande
1be10 64 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b 65  d to us in pUnKe
1be20 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1be30 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d  ( pKey==0 );.  }
1be40 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1be50 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20  int lwr, upr;.  
1be60 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
1be70 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1be80 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1be90 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
1bea0 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
1beb0 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
1bec0 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
1bed0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
1bee0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
1bef0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
1bf00 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  !pPage->intKey &
1bf10 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20  & pUnKey==0 ){. 
1bf20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bf30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1bf40 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1bf50 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
1bf60 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
1bf70 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1bf80 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d  idx = upr;.    }
1bf90 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1bfa0 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72  ->idx = (upr+lwr
1bfb0 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )/2;.    }.    i
1bfc0 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f  f( lwr<=upr ) fo
1bfd0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69  r(;;){.      voi
1bfe0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
1bff0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
1c000 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
1c010 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1c020 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1c030 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ey = 1;.      if
1c040 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1c050 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
1c060 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
1c070 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1c080 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1c090 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
1c0a0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
1c0b0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1c0c0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
1c0d0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
1c0e0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
1c0f0 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
1c100 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20   dummy);.       
1c110 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1c120 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1c130 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1c140 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1c150 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20  ey==nKey ){.    
1c160 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1c170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1c180 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  CellKey<nKey ){.
1c190 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
1c1a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c1b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1c1c0 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79  t( nCellKey>nKey
1c1d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
1c1e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1c1f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c200 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
1c210 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
1c220 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
1c230 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1c240 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
1c250 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b  ;.        nCellK
1c260 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
1c270 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nKey;.        if
1c280 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65  ( available>=nCe
1c290 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  llKey ){.       
1c2a0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1c2b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c2c0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1c2d0 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20  ey, pUnKey);.   
1c2e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c2f0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1c300 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
1c310 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20  nCellKey );.    
1c320 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
1c330 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
1c340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c350 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1c360 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1c370 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
1c380 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1c390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1c3a0 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ey(pCur, 0, nCel
1c3b0 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43  lKey, (void *)pC
1c3c0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1c3d0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1c3e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c3f0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1c400 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20  ey, pUnKey);.   
1c410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1c420 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
1c430 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1c440 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1c450 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1c460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c470 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
1c480 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
1c490 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
1c4a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1c4b0 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50  >leafData && !pP
1c4c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c4d0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75         lwr = pCu
1c4e0 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  r->idx;.        
1c4f0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
1c500 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c510 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c530 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b  Res ) *pRes = 0;
1c540 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c560 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c570 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1c580 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1c590 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
1c5a0 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1c5b0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
1c5c0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
1c5d0 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20  = pCur->idx-1;. 
1c5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c5f0 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
1c600 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1c610 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
1c620 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
1c640 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  r->idx = (lwr+up
1c650 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1c660 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
1c670 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
1c680 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1c690 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1c6a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1c6b0 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
1c6c0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
1c6d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1c6e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1c6f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1c700 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1c710 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
1c720 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
1c730 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
1c740 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
1c750 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
1c760 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
1c770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1c780 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
1c790 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
1c7a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1c7b0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1c7c0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
1c7d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c7e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c7f0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1c800 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1c810 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
1c820 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1c830 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1c840 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
1c850 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1c860 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
1c870 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
1c880 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
1c890 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
1c8a0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1c8b0 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74    /* If we creat
1c8c0 65 64 20 6f 75 72 20 6f 77 6e 20 75 6e 70 61 63  ed our own unpac
1c8d0 6b 65 64 20 6b 65 79 20 61 74 20 74 68 65 20 74  ked key at the t
1c8e0 6f 70 20 6f 66 20 74 68 69 73 0a 20 20 20 20 2a  op of this.    *
1c8f0 2a 20 70 72 6f 63 65 64 75 72 65 2c 20 74 68 65  * procedure, the
1c900 6e 20 64 65 73 74 72 6f 79 20 74 68 61 74 20 6b  n destroy that k
1c910 65 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ey before return
1c920 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ing. */.    sqli
1c930 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
1c940 61 63 6b 65 64 52 65 63 6f 72 64 28 70 55 6e 4b  ackedRecord(pUnK
1c950 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
1c960 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c970 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1c980 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1c990 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1c9a0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1c9b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1c9c0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1c9d0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1c9e0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1c9f0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1ca00 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1ca10 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1ca20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1ca30 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1ca40 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1ca50 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1ca60 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1ca70 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1ca80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ca90 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1caa0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1cab0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1cac0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1cad0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1cae0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1caf0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1cb00 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1cb10 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1cb20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1cb30 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1cb40 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1cb50 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1cb60 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1cb70 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1cb80 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1cb90 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1cba0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1cbb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1cbc0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1cbd0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1cbe0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1cbf0 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1cc00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1cc10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1cc20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1cc30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1cc40 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  x) );.  return p
1cc50 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  Cur->pBtree->db;
1cc60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
1cc70 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1cc80 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
1cc90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1cca0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1ccb0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1ccc0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1ccd0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1cce0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1ccf0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1cd00 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1cd10 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1cd20 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1cd30 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1cd40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cd50 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
1cd60 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1cd70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1cd80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1cd90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1cda0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1cdb0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1cdc0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1cdd0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1cde0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cdf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1ce00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ce10 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1ce20 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1ce30 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1ce40 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ce50 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1ce60 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ce70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ce80 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1ce90 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
1cea0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1ceb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1cec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ced0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1cee0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1cef0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1cf00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cf10 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1cf20 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64  l );..  pCur->id
1cf30 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  x++;.  pCur->inf
1cf40 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1cf50 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1cf60 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1cf70 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1cf80 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1cf90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cfa0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1cfb0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1cfc0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1cfd0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1cfe0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1cff0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1d000 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1d010 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1d020 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1d030 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1d040 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1d050 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  o{.      if( sql
1d060 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1d070 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1d080 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1d090 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1d0a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1d0b0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1d0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d0e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d0f0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1d100 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1d110 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1d120 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1d130 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1d140 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1d150 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1d160 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
1d170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1d180 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
1d190 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1d1a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d1b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d1c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d1d0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
1d1e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1d1f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d200 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
1d210 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1d220 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
1d230 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1d240 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
1d250 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
1d260 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
1d270 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d280 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1d290 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1d2a0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1d2b0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1d2c0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1d2d0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1d2e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d2f0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
1d300 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1d310 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
1d320 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
1d330 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1d340 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1d350 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1d360 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67  nt rc;.  Pgno pg
1d370 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  no;.  MemPage *p
1d380 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1d390 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d3a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1d3b0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1d3c0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1d3d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d3e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1d3f0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
1d400 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
1d410 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1d420 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1d430 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1d440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d450 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1d460 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
1d470 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1d480 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1d490 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1d4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d4b0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1d4c0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
1d4d0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
1d4e0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1d4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d500 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20  ur->idx>=0 );.  
1d510 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1d520 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1d530 65 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c  et4byte( findCel
1d540 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1d550 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  dx) );.    rc = 
1d560 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1d570 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
1d580 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1d590 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d5a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1d5b0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1d5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1d5d0 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29  ( pCur->idx==0 )
1d5e0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1d5f0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
1d600 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1d610 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1d620 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1d630 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1d640 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1d650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d670 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1d680 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1d690 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1d6a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
1d6b0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
1d6c0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1d6d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
1d6e0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1d6f0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1d700 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1d710 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d730 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1d740 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1d750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1d760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d770 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
1d780 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1d790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1d7a0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
1d7b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d7c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
1d7d0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
1d7e0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
1d7f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
1d800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d810 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
1d820 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
1d830 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
1d840 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
1d850 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
1d860 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
1d870 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
1d880 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
1d890 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
1d8a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d8b0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
1d8c0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
1d8d0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
1d8e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1d8f0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
1d900 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
1d910 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
1d920 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
1d930 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
1d940 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
1d950 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
1d960 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
1d970 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
1d980 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1d990 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
1d9a0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
1d9b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
1d9c0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
1d9d0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
1d9e0 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
1d9f0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
1da00 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
1da10 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
1da20 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
1da30 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
1da40 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
1da50 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
1da60 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
1da70 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
1da80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1da90 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
1daa0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
1dab0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
1dac0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
1dad0 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
1dae0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
1daf0 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
1db00 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
1db10 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
1db20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
1db30 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
1db40 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
1db50 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
1db60 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
1db70 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1db80 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
1db90 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
1dba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dbb0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1dbc0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1dbd0 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
1dbe0 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
1dbf0 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
1dc00 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
1dc10 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
1dc20 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
1dc30 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  rc;.  int n;    
1dc40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1dc50 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1dc60 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20  ist */.  int k; 
1dc70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dc80 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
1dc90 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
1dca0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
1dcb0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
1dcc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
1dcd0 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73  runk = 0;..  ass
1dce0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1dcf0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1dd00 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  ex) );.  pPage1 
1dd10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1dd20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
1dd30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1dd40 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  );.  if( n>0 ){.
1dd50 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1dd60 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1dd70 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
1dd80 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
1dd90 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
1dda0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
1ddb0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
1ddc0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
1ddd0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
1dde0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
1ddf0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
1de00 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
1de10 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
1de20 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
1de30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1de40 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
1de50 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
1de60 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
1de70 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1de80 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
1de90 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
1dea0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
1deb0 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
1dec0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1ded0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1dee0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
1def0 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61  ct && nearby<=pa
1df00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1df10 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1df20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1df30 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
1df40 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
1df50 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1df60 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
1df70 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1df80 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
1df90 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1dfa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1dfb0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1dfc0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1dfd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
1dfe0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
1dff0 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
1e000 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
1e010 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1e020 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
1e030 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
1e040 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
1e050 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1e060 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
1e070 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
1e080 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
1e090 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
1e0a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1e0b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e0c0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1e0d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1e0e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e0f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1e100 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
1e110 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
1e120 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
1e130 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
1e140 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
1e150 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
1e160 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
1e170 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
1e180 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
1e190 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
1e1a0 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
1e1b0 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
1e1c0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
1e1d0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
1e1e0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
1e1f0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1e200 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1e210 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
1e220 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
1e230 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1e240 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1e250 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1e260 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1e270 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1e280 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
1e290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e2a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e2b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
1e2c0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
1e2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1e2e0 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
1e2f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1e300 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e310 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
1e320 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
1e330 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1e340 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
1e350 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
1e360 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
1e370 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
1e380 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
1e390 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
1e3a0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
1e3b0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
1e3c0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
1e3d0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
1e3e0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
1e3f0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
1e400 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
1e410 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e420 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
1e430 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1e440 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e450 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1e460 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1e470 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1e480 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1e490 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1e4a0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
1e4b0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
1e4c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1e4d0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1e4e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e4f0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
1e500 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1e510 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1e520 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1e530 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1e540 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1e550 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1e560 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
1e570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70     }else if( k>p
1e580 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
1e590 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20   - 2 ){.        
1e5a0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
1e5b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1e5c0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1e5d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
1e5e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1e5f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1e600 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e610 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
1e620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e630 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
1e640 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
1e650 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
1e660 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1e670 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
1e680 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
1e690 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
1e6a0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
1e6b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
1e6c0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
1e6d0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
1e6e0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
1e6f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
1e700 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
1e710 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
1e720 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1e730 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
1e740 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1e750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e760 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1e770 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e780 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e790 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e7a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1e7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e7c0 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
1e7d0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1e7e0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1e7f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1e800 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e810 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e820 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e840 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
1e850 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e860 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1e870 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1e880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e8a0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
1e8b0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
1e8c0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
1e8d0 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
1e8e0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
1e8f0 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
1e900 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
1e910 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
1e920 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
1e930 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
1e940 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
1e950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
1e960 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
1e970 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
1e980 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
1e990 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e9a0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
1e9b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e9c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e9d0 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
1e9e0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
1e9f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ea00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ea10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ea20 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1ea30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ea40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ea50 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
1ea60 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1ea70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1ea80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1eaa0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1eab0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1eac0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ead0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1eae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
1eaf0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1eb00 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1eb10 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1eb20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
1eb30 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
1eb40 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
1eb50 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1eb60 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1eb70 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
1eb80 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
1eb90 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
1eba0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1ebb0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1ebc0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1ebd0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1ebe0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1ebf0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
1ec00 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1ec10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ec20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ec30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1ec40 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
1ec50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ec60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ec70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ec80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1eca0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ecb0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1ecc0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
1ecd0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1ece0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ecf0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1ed00 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1ed10 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1ed20 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1ed30 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1ed40 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
1ed50 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1ed60 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
1ed70 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
1ed80 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
1ed90 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
1eda0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
1edb0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
1edc0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
1edd0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
1ede0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1edf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ee00 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1ee10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ee20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1ee30 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1ee40 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1ee50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
1ee60 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
1ee70 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
1ee80 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1ee90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1eea0 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
1eeb0 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
1eec0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1eed0 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
1eee0 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
1eef0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1ef00 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
1ef10 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
1ef20 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1ef30 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ef50 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
1ef60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1ef70 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
1ef80 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1ef90 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
1efa0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1efc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1efe0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1eff0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f000 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
1f010 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
1f020 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
1f030 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
1f040 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
1f050 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
1f060 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  int nPage;.     
1f070 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
1f080 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
1f090 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
1f0a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1f0b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
1f0c0 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29  ( *pPgno>nPage )
1f0d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1f0e0 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
1f0f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1f100 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
1f110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1f120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f130 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f140 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f160 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1f170 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1f180 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1f190 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1f1a0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1f1b0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1f1c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f1d0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1f1e0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1f1f0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1f200 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1f210 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1f220 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f230 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1f240 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1f250 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1f260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1f270 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1f280 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1f290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f2a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1f2b0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
1f2c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
1f2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f2f0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1f300 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  Rollback((*ppPag
1f310 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1f320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f340 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1f350 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f380 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f390 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
1f3a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1f3c0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1f3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f3e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1f3f0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1f400 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1f410 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
1f420 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
1f430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f440 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
1f450 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1f460 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
1f470 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
1f480 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
1f490 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  e file */.    in
1f4a0 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50  t nPage = pagerP
1f4b0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1f4c0 61 67 65 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e  ager);.    *pPgn
1f4d0 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
1f4e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f4f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f500 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1f510 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nc ){.      /* A
1f520 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61  n incr-vacuum ha
1f530 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69  s already run wi
1f540 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
1f550 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20  ction. So the.  
1f560 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61      ** page to a
1f570 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66  llocate is not f
1f580 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c  rom the physical
1f590 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1f5a0 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  , but.      ** a
1f5b0 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a  t pBt->nTrunc. .
1f5c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a        */.      *
1f5d0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72  pPgno = pBt->nTr
1f5e0 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  unc+1;.      if(
1f5f0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1f600 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f610 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67  ){.        (*pPg
1f620 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  no)++;.      }. 
1f630 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1f640 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1f650 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f660 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1f670 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1f680 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1f690 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1f6a0 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1f6b0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1f6c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1f6d0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1f6e0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1f6f0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1f700 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1f710 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1f720 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1f730 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1f740 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1f750 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1f760 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1f770 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1f780 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f790 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1f7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1f7b0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1f7c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1f7d0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1f7e0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
1f7f0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
1f800 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
1f810 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
1f820 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  }.    if( pBt->n
1f830 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  Trunc ){.      p
1f840 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50  Bt->nTrunc = *pP
1f850 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  gno;.    }.#endi
1f860 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1f870 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1f880 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1f890 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f8a0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1f8b0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1f8c0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1f8d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f8e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f8f0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1f900 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1f910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1f930 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1f940 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1f950 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1f960 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1f970 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1f980 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1f990 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1f9a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f9b0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1f9c0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1f9d0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1f9e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1f9f0 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1fa00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1fa10 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1fa20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1fa30 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1fa40 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1fa50 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1fa60 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1fa70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fa80 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1fa90 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1faa0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1fab0 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1fac0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1fad0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1fae0 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1faf0 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1fb00 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1fb10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fb20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1fb30 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1fb40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fb50 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1fb60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1fb70 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1fb80 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1fb90 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1fba0 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1fbb0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1fbc0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1fbd0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1fbe0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fbf0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1fc00 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1fc10 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
1fc20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1fc30 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1fc40 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1fc50 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
1fc60 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1fc70 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1fc80 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
1fc90 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1fca0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1fcb0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
1fcc0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
1fcd0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
1fce0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
1fcf0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
1fd00 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1fd10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fd20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1fd30 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1fd40 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
1fd50 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1fd60 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
1fd70 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
1fd80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fda0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1fdb0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1fdc0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
1fdd0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
1fde0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
1fdf0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1fe00 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
1fe10 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ee..  */.  if( p
1fe20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1fe30 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
1fe40 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d  pPut(pBt, pPage-
1fe50 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52  >pgno, PTRMAP_FR
1fe60 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  EEPAGE, 0);.    
1fe70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fe80 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1fe90 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1fea0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1feb0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1fec0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1fed0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fee0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1fef0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ff00 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
1ff10 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1ff20 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
1ff30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1ff40 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1ff50 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
1ff60 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1ff70 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
1ff80 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
1ff90 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
1ffa0 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
1ffb0 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
1ffc0 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
1ffd0 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
1ffe0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1fff0 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
20000 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
20010 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
20020 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
20030 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20040 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
20050 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
20060 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
20070 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
20080 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20090 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
200a0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
200b0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
200c0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
200d0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
200e0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
200f0 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
20100 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
20110 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
20120 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
20130 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a  with no leaves..
20140 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20150 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
20160 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
20170 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
20180 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
20190 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
201a0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
201b0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
201c0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
201d0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
201e0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
201f0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
20200 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
20210 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
20220 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
20230 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
20240 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
20250 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
20260 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
20270 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
20280 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
20290 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
202a0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
202b0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
202c0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
202d0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
202e0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
202f0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
20300 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
20310 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74   contain to rest
20320 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
20330 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
20340 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
20350 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
20360 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
20370 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
20380 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
20390 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
203a0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
203b0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
203c0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
203d0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
203e0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
203f0 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
20400 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
20410 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
20420 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
20430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20440 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20450 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
20480 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
20490 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  Data, pTrunk->pg
204a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  no);.        put
204b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
204c0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
204d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
204e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
204f0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
20500 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46         TRACE(("F
20510 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
20520 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
20530 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20  acing %d\n",.   
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
20550 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
20560 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
20570 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
20580 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
20590 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
205a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
205b0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
205c0 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61  wly freed page a
205d0 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20  s a leaf on the 
205e0 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f  current trunk */
205f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20600 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
20610 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
20620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20640 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
20650 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
20660 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
20670 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
20680 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61  Data[8+k*4], pPa
20690 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ge->pgno);.#ifnd
206a0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
206b0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
206c0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
206d0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
206e0 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
206f0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
20700 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
20710 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
20720 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
20730 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
20740 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
20750 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
20760 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unk);.  }.  retu
20770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20780 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
20790 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
207a0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
207b0 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
207c0 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
207d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
207e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
207f0 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
20800 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
20810 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
20820 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
20830 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
20840 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
20850 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  int ovflPageSize
20860 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
20870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
20880 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
20890 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
208a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
208b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
208c0 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
208d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
208e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
208f0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
20900 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
20910 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
20920 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
20930 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
20940 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
20950 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
20960 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
20970 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
20980 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
20990 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
209a0 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
209b0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
209c0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
209d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
209e0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
209f0 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
20a00 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65  Ovfl-- ){.    Me
20a10 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20  mPage *pOvfl;.  
20a20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d    if( ovflPgno==
20a30 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  0 || ovflPgno>pa
20a40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
20a50 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
20a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20a70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20a80 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
20a90 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
20aa0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
20ab0 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
20ac0 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
20ad0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20ae0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
20af0 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
20b00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
20b10 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
20b20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20b30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20b50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20b60 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
20b70 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
20b80 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
20b90 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
20ba0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
20bb0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
20bc0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
20bd0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
20be0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
20bf0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
20c00 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
20c10 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
20c20 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
20c30 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
20c40 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
20c50 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
20c60 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
20c70 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
20c80 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
20c90 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
20ca0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
20cb0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
20cc0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
20cd0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
20ce0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
20cf0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
20d00 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
20d10 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
20d20 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
20d30 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
20d40 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
20d50 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
20d60 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
20d70 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
20d80 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
20d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
20da0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
20db0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
20dc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
20dd0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
20de0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
20df0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
20e00 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
20e10 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
20e20 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
20e30 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
20e40 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
20e50 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
20e60 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e80 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
20e90 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
20ea0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
20eb0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
20ec0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20ed0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
20ee0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
20ef0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
20f00 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
20f10 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
20f20 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
20f30 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
20f40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
20f50 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
20f60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
20f70 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
20f80 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
20f90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20fa0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
20fb0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
20fc0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
20fd0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
20fe0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
20ff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21000 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
21010 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  tex) );..  /* Fi
21020 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
21030 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
21040 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
21050 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
21060 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
21070 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
21080 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
21090 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
210a0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
210b0 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
210c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
210d0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
210e0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
210f0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
21100 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
21110 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  4*)&nKey);.  sql
21120 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21130 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21140 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
21150 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
21160 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
21170 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
21180 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
21190 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
211a0 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b  ==nData+nZero );
211b0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
211c0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
211d0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
211e0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
211f0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21200 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
21210 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
21220 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
21230 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21240 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     nPayload += n
21250 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
21260 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
21270 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e   nKey;.  }.  *pn
21280 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
21290 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
212a0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
212b0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
212c0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
212d0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
212e0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
212f0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
21300 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
21310 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
21320 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74       int isExact
21330 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
21340 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21350 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
21360 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
21370 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
21380 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
21390 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
213a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
213b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
213c0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
213d0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
213e0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
213f0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
21400 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
21410 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
21420 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
21430 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
21440 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21450 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31    if( pgnoOvfl>1
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
21470 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f   isExact = 1; */
21480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21490 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
214a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
214b0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
214c0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
214d0 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74  gnoOvfl, isExact
214e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
214f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21500 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
21510 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
21520 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
21530 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
21540 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
21550 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
21560 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
21570 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
21580 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
21590 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
215a0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
215b0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
215c0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
215d0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
215e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
215f0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
21600 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
21610 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
21620 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
21630 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
21640 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
21650 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
21660 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
21670 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
21680 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
21690 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
216a0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
216b0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
216c0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
216d0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
216e0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
216f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21700 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
21710 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
21720 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
21730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21740 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
21750 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
21760 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
21770 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
21780 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
21790 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
217a0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
217b0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
217c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
217d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
217e0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
217f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21800 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
21810 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21820 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
21830 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21840 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21850 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
21860 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
21870 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21880 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
21890 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
218a0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
218b0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
218c0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
218d0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
218e0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
218f0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
21900 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
21910 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
21920 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
21930 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
21940 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
21950 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
21960 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53  Left;.    if( nS
21970 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
21980 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
21990 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
219a0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
219b0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
219c0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
219d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
219e0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
219f0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
21a00 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
21a10 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
21a20 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
21a30 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
21a40 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
21a50 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
21a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
21a70 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
21a80 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
21a90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
21aa0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
21ab0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21ac0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21ad0 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61  Change the MemPa
21ae0 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  ge.pParent point
21af0 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77  er on the page w
21b00 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  hose number is.*
21b10 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  * given in the s
21b20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
21b30 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70  o that MemPage.p
21b40 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65  Parent holds the
21b50 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  .** pointer in t
21b60 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
21b70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
21b80 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74   reparentPage(Bt
21b90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
21ba0 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20  o pgno, MemPage 
21bb0 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74  *pNewParent, int
21bc0 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65   idx){.  MemPage
21bd0 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67   *pThis;.  DbPag
21be0 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
21bf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21c00 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
21c10 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
21c20 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30  t( pNewParent!=0
21c30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
21c40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
21c50 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
21c60 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
21c70 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
21c80 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
21c90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
21ca0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
21cb0 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20  ge ){.    pThis 
21cc0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
21cd0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
21ce0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
21cf0 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e 69  if( pThis->isIni
21d00 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
21d10 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d  t( pThis->aData=
21d20 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
21d30 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
21d40 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
21d50 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50  ->pParent!=pNewP
21d60 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
21d70 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
21d80 65 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67  ent ) sqlite3Pag
21d90 65 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70  erUnref(pThis->p
21da0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
21db0 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d  ;.        pThis-
21dc0 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50  >pParent = pNewP
21dd0 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73  arent;.        s
21de0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
21df0 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  NewParent->pDbPa
21e00 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
21e10 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72     pThis->idxPar
21e20 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d  ent = idx;.    }
21e30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21e40 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
21e50 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
21e60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21e70 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
21e80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
21e90 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
21ea0 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54  ut(pBt, pgno, PT
21eb0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
21ec0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
21ed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
21ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21ef0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
21f00 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e  the pParent poin
21f10 74 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  ter of all child
21f20 72 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20  ren of pPage to 
21f30 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f  point back.** to
21f40 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pPage..**.** In
21f50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f   other words, fo
21f60 72 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66  r every child of
21f70 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72   pPage, invoke r
21f80 65 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a  eparentPage().**
21f90 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
21fa0 61 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e  at each child kn
21fb0 6f 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69  ows that pPage i
21fc0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a  s its parent..**
21fd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21fe0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74   gets called aft
21ff0 65 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20  er you memcpy() 
22000 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a  one page into.**
22010 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61   another..*/.sta
22020 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74  tic int reparent
22030 43 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61  ChildPages(MemPa
22040 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
22050 74 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20  t i;.  BtShared 
22060 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
22070 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
22080 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
22090 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
220a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
220b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
220c0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
220d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
220e0 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  K;..  for(i=0; i
220f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
22100 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
22110 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
22120 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 72 63 20  age, i);.    rc 
22130 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
22140 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
22150 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a  ll), pPage, i);.
22160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22170 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22180 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  c;.  }.  rc = re
22190 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
221a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
221b0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
221c0 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20  rOffset+8]), .  
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 70    pPage, i);.  p
221f0 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
22200 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
22210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
22220 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
22230 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
22240 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
22250 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
22260 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
22270 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
22280 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
22290 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
222a0 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
222b0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
222c0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
222d0 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
222e0 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
222f0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
22300 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
22310 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
22320 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
22330 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22340 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
22350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
22360 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
22370 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
22380 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  nt sz){.  int i;
22390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
223a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
223b0 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
223c0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
223d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
223e0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
223f0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22400 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
22410 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
22420 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
22430 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
22440 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
22450 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
22460 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
22470 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
22480 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
22490 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
224a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
224b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
224c0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
224d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
224e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
224f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
22500 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22510 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
22520 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
22530 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
22540 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
22550 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
22560 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tr);.  assert( p
22570 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70  c>10 && pc+sz<=p
22580 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
22590 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53  eSize );.  freeS
225a0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
225b0 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78  sz);.  for(i=idx
225c0 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
225d0 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
225e0 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
225f0 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
22600 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
22610 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
22620 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
22630 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
22640 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
22650 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
22660 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50  nFree += 2;.  pP
22670 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
22680 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  1;.}../*.** Inse
22690 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
226a0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
226b0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
226c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
226d0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
226e0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
226f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
22700 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
22710 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
22720 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
22730 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
22740 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
22750 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
22760 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
22770 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
22780 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
22790 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
227a0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
227b0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
227c0 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
227d0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
227e0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
227f0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
22800 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
22810 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
22820 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
22830 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
22840 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
22850 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
22860 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
22870 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
22880 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
22890 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
228a0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
228b0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
228c0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
228d0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
228e0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
228f0 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
22900 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
22910 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22920 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
22930 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
22940 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
22950 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
22960 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
22970 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
22980 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
22990 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
229a0 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
229b0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
229c0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
229d0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
229e0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
229f0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
22a00 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
22a10 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
22a20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
22a30 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
22a40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
22a50 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
22a60 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
22a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
22a80 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
22a90 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
22aa0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
22ab0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
22ac0 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
22ad0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38  f needed */.  u8
22ae0 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   nSkip          
22af0 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  /* Do not write 
22b00 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
22b10 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
22b20 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  l */.){.  int id
22b30 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
22b40 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
22b50 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
22b60 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
22b70 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
22b80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22b90 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
22ba0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22bb0 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
22bc0 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
22bd0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
22be0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
22bf0 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
22c00 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
22c10 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
22c20 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
22c30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
22c40 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
22c50 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
22c60 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
22c70 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
22c80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
22c90 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
22ca0 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
22cb0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
22cc0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
22cd0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
22ce0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
22cf0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
22d00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
22d10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
22d20 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
22d30 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
22d40 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
22d50 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
22d60 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
22d70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  /..  assert( i>=
22d80 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
22d90 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
22da0 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
22db0 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50  t( sz==cellSizeP
22dc0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
22dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22de0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22df0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
22e00 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
22e10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
22e20 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
22e30 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
22e40 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
22e50 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
22e60 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
22e70 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
22e80 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
22e90 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
22ea0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
22eb0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69      assert( j<si
22ec0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
22ed0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
22ee0 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20  >aOvfl[0]) );.  
22ef0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
22f00 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
22f10 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
22f20 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20  l[j].idx = i;.  
22f30 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
22f40 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22f50 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
22f60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
22f70 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
22f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
22fa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
22fb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22fc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
22fd0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
22fe0 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
22ff0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
23000 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
23010 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70  rOffset;.    top
23020 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
23030 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63  a[hdr+5]);.    c
23040 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
23050 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
23060 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66     end = cellOff
23070 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
23080 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e  Cell + 2;.    in
23090 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
230a0 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e   2*i;.    if( en
230b0 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a  d > top - sz ){.
230c0 20 20 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74        defragment
230d0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
230e0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
230f0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
23100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
23110 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
23120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
23130 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
23140 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
23150 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
23160 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
23170 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
23180 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
23190 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
231a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
231b0 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
231c0 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
231d0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
231e0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
231f0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
23200 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
23210 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
23220 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
23230 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
23240 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
23250 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
23260 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
23270 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
23280 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
23290 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
232a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
232b0 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64  Shift = 1;.#ifnd
232c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
232d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
232e0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
232f0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23300 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
23310 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
23320 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
23330 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
23340 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
23350 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
23360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23370 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
23380 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
23390 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
233a0 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
233b0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
233c0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
233d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
233e0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
233f0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
23400 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
23410 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
23420 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f  .      if( (info
23430 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
23440 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
23450 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
23460 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
23470 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
23480 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
23490 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
234a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
234b0 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
234c0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
234d0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
234e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
234f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23500 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
23510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
23520 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
23530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23540 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
23550 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
23560 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
23570 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
23580 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
23590 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
235a0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
235b0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
235c0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
235d0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
235e0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
235f0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
23600 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
23610 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
23620 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
23630 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
23640 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
23650 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
23660 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
23670 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
23680 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
23690 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
236a0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
236b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
236c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
236d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
236e0 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
236f0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
23700 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
23710 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
23720 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
23730 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
23740 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
23750 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
23760 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
23770 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
23780 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
23790 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
237a0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
237b0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
237c0 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
237d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
237e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
237f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23800 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23810 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
23820 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  ) );.  totalSize
23830 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
23840 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
23850 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
23860 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
23870 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
23880 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
23890 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
238a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
238b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
238c0 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
238d0 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
238e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
238f0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
23900 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
23910 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
23920 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
23930 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
23940 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
23950 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
23960 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
23970 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
23980 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23990 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
239a0 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
239b0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
239c0 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
239d0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
239e0 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
239f0 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
23a00 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
23a10 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
23a20 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
23a30 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
23a40 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
23a50 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
23a60 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
23a70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23a80 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
23a90 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
23aa0 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
23ab0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
23ac0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
23ad0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
23ae0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
23af0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
23b00 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
23b10 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
23b20 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
23b30 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
23b40 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
23b50 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
23b60 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
23b70 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
23b80 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
23b90 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
23ba0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
23bb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
23bc0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
23bd0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
23be0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
23bf0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
23c00 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
23c10 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
23c20 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
23c30 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
23c40 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
23c50 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
23c60 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
23c70 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
23c80 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
23c90 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
23ca0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
23cb0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
23cc0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
23cd0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
23ce0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
23cf0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
23d00 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
23d10 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
23d20 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
23d30 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
23d40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23d50 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
23d60 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
23d70 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
23d80 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
23d90 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
23da0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
23db0 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
23dc0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
23dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
23de0 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
23df0 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
23e00 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
23e10 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
23e20 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
23e30 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
23e40 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
23e50 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
23e60 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
23e70 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
23e80 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
23e90 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
23ea0 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
23eb0 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
23ec0 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
23ed0 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
23ee0 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
23ef0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
23f00 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
23f10 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
23f20 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
23f30 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
23f40 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
23f50 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
23f60 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
23f70 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
23f80 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
23f90 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
23fa0 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
23fb0 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
23fc0 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
23fd0 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
23fe0 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
23ff0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
24000 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
24010 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
24020 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
24030 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
24040 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
24050 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
24060 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
24070 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
24080 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
24090 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
240a0 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
240b0 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
240c0 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
240d0 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
240e0 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
240f0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
24100 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
24110 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
24120 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
24130 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
24140 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
24150 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
24160 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
24170 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
24180 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
24190 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b  l;.  u16 szCell;
241a0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
241b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
241c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
241d0 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
241e0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
241f0 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
24200 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
24210 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
24220 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24240 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
24250 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
24260 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
24290 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
242a0 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
242b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
242c0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
242d0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  utex) );..  /* A
242e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
242f0 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f  ge. Insert the o
24300 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
24310 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74  m pPage.  ** int
24320 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76  o it. Then remov
24330 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24340 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
24350 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
24360 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
24370 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
24380 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
24390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
243a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
243b0 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70  .  }.  pCell = p
243c0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
243d0 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  Cell;.  szCell =
243e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
243f0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65  ge, pCell);.  ze
24400 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61  roPage(pNew, pPa
24410 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ge->aData[0]);. 
24420 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
24430 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
24440 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  szCell);.  pPage
24450 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
24460 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70  ..  /* Set the p
24470 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  arent of the new
24480 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
24490 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  e to pParent. */
244a0 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74  .  pNew->pParent
244b0 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71   = pParent;.  sq
244c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
244d0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
244e0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
244f0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
24500 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
24510 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
24520 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  s.  ** so that t
24530 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
24540 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
24550 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
24560 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73  nd.  ** pPage is
24570 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67   the next-to-rig
24580 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2a 0a  ht child. .  **.
24590 20 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    ** Ignore the 
245a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
245b0 74 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c  the call to fill
245c0 49 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e  InCell(). fillIn
245d0 43 65 6c 6c 28 29 0a 20 20 2a 2a 20 6d 61 79 20  Cell().  ** may 
245e0 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65  only return othe
245f0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
24600 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72   if it is requir
24610 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
24620 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   ** one or more 
24630 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
24640 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61  Since an interna
24650 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63  l table B-Tree c
24660 65 6c 6c 20 0a 20 20 2a 2a 20 6d 61 79 20 6e 65  ell .  ** may ne
24670 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f  ver spill over o
24680 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nto an overflow 
24690 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61  page (it is a ma
246a0 78 69 6d 75 6d 20 6f 66 20 0a 20 20 2a 2a 20 31  ximum of .  ** 1
246b0 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29  3 bytes in size)
246c0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63  , it is not necc
246d0 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20  essary to check 
246e0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
246f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c  .  **.  ** Simil
24700 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74  arly, the insert
24710 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  Cell() function 
24720 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74  cannot fail if t
24730 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 62 65 69  he page.  ** bei
24740 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ng inserted into
24750 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74   is already writ
24760 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c  able and the cel
24770 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 2a 2a  l does not .  **
24780 20 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72   contain an over
24790 66 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f  flow pointer. So
247a0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74   ignore this ret
247b0 75 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20  urn code too..  
247c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
247d0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
247e0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
247f0 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
24800 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69  nCell-1);.  sqli
24810 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
24820 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
24830 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 66 69 6c  l, &info);.  fil
24840 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
24850 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
24860 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
24870 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29   0, &parentSize)
24880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  ;.  assert( pare
24890 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 61  ntSize<64 );.  a
248a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
248b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
248c0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
248d0 20 29 3b 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c   );.  insertCell
248e0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
248f0 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
24900 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
24910 34 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 66  4);.  put4byte(f
24920 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
24930 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64  pParent,parentId
24940 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  x), pPage->pgno)
24950 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
24960 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
24970 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
24980 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23  8], pgnoNew);..#
24990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
249a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
249b0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
249c0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
249d0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
249e0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
249f0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
24a00 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
24a10 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
24a20 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a  r from the .  **
24a30 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
24a40 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
24a50 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
24a60 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
24a70 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
24a80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
24a90 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
24aa0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
24ab0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
24ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24ad0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
24ae0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a  tOvfl(pNew, 0);.
24af0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24b10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
24b20 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  (pNew);.      re
24b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24b40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
24b50 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
24b60 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
24b70 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63   page and balanc
24b80 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
24b90 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  e,.  ** in case 
24ba0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
24bb0 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
24bc0 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
24bd0 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72  erfull..  */.  r
24be0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
24bf0 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e  ;.  return balan
24c00 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
24c10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
24c20 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
24c30 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ANCE */../*.** T
24c40 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
24c50 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20  stributes Cells 
24c60 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  on pPage and up 
24c70 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73  to NN*2 siblings
24c80 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20  .** of pPage so 
24c90 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
24ca0 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61  ave about the sa
24cb0 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
24cc0 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61  e space..** Usua
24cd0 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  lly NN siblings 
24ce0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
24cf0 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20  f pPage is used 
24d00 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
24d10 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65  ,.** though more
24d20 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
24d30 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69  come from one si
24d40 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74  de if pPage is t
24d50 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c  he first.** or l
24d60 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
24d70 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61   parent.  If pPa
24d80 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ge has fewer tha
24d90 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a  n 2*NN siblings.
24da0 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  ** (something wh
24db0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
24dc0 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20  pen if pPage is 
24dd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  the root page or
24de0 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20   a .** child of 
24df0 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61  root) then all a
24e00 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
24e10 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  s participate in
24e20 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
24e30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
24e40 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
24e50 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69  pPage might be i
24e60 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
24e70 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a  eased by one or.
24e80 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  ** two in an eff
24e90 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
24ea0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
24eb0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
24ec0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   The root page.*
24ed0 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64  * is special and
24ee0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
24ef0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
24f00 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20  If pPage is .** 
24f10 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  the root page, t
24f20 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66  hen the depth of
24f30 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20   the tree might 
24f40 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20  be increased.** 
24f50 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
24f60 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72  one, as necessar
24f70 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72  y, to keep the r
24f80 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65  oot page from be
24f90 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20  ing.** overfull 
24fa0 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  or completely em
24fb0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  pty..**.** Note 
24fc0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
24fd0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
24fe0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65  , some of the Ce
24ff0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20  lls on pPage.** 
25000 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
25010 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
25020 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20  pPage->aData[]. 
25030 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
25040 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
25050 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61  is overfull.  Pa
25060 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66  rt of the job of
25070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25080 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65   to.** make sure
25090 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70   all Cells for p
250a0 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20  Page once again 
250b0 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  fit in pPage->aD
250c0 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ata[]..**.** In 
250d0 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
250e0 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c  lancing the sibl
250f0 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74  ings of pPage, t
25100 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
25110 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f  ge.** might beco
25120 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
25130 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68  nderfull.  If th
25140 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e  at happens, then
25150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
25160 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
25170 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61  sively on the pa
25180 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rent..**.** If t
25190 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
251a0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
251b0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
251c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
251d0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
251e0 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68  state.  So if th
251f0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
25200 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
25210 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
25220 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
25230 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
25240 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a  onroot(MemPage *
25250 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
25260 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
25270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
25280 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f  rent of pPage */
25290 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
252a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
252b0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
252c0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
252d0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
252e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
252f0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
25300 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
25310 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
25320 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
25330 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
25340 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
25350 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rom. */.  int nO
25360 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
25370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25380 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
25390 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ld[] */.  int nN
253a0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
253b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
253c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
253d0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ew[] */.  int nD
253e0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
253f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25400 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44   of cells in apD
25410 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  iv[] */.  int i,
25420 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
25430 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
25440 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
25450 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
25460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
25470 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70  ex of pPage in p
25480 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
25490 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
254c0 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
254d0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
254e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25500 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
25510 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72  */.  int leafCor
25520 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
25530 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
25540 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
25550 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
25560 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
25570 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25580 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
25590 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
255a0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
255b0 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
255c0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
255d0 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
255e0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
255f0 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25610 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
25620 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
25630 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
25650 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
25660 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
25670 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
25680 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
25690 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
256a0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
256b0 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
256c0 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20  t iSpace2 = 0;  
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
256e0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
256f0 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a  of aSpace2[] */.
25700 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b    int szScratch;
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25720 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63  * Size of scratc
25730 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74  h memory request
25740 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
25750 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
25760 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
25770 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
25780 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
25790 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
257a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
257b0 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
257c0 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
257d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
257e0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
257f0 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
25800 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
25810 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
25820 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
25830 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
25840 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
25850 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
25860 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
25870 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
25880 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25890 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
258a0 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
258b0 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
258c0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
258d0 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
258e0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
258f0 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
25900 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
25910 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
25920 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
25930 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
25940 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
25950 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
25960 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
25970 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
25980 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
25990 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
259a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
259b0 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
259c0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
259d0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
259e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
259f0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
25a00 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25a10 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
25a20 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
25a30 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
25a40 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
25a50 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
25a60 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
25a70 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
25a80 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
25a90 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61   cells before ba
25aa0 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61  lance */.  u8 *a
25ab0 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25ac0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f    /* Space for o
25ad0 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73  verflow dividers
25ae0 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c   cells after bal
25af0 61 6e 63 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ance */.#ifndef 
25b00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25b10 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72  VACUUM.  u8 *aFr
25b20 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  om = 0;.#endif..
25b30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25b40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
25b50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
25b60 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46  );..  /* .  ** F
25b70 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70  ind the parent p
25b80 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
25b90 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
25ba0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
25bb0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25bc0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
25bd0 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d  bPage) || pPage-
25be0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
25bf0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
25c00 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  pBt;.  pParent =
25c10 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
25c20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
25c30 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  nt );.  if( SQLI
25c40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
25c50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25c60 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
25c70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25c80 72 63 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  rc;.  }..  TRACE
25c90 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
25ca0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
25cb0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
25cc0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
25cd0 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
25ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
25cf0 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
25d00 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
25d10 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
25d20 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
25d30 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
25d40 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
25d50 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
25d60 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
25d70 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
25d80 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
25d90 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
25da0 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
25db0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
25dc0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
25dd0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
25de0 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
25df0 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
25e00 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
25e10 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
25e20 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
25e30 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
25e40 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
25e50 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
25e60 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
25e70 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
25e80 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
25e90 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
25ea0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
25eb0 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
25ec0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
25ed0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
25ee0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
25ef0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
25f00 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
25f10 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
25f20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
25f30 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
25f40 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
25f50 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
25f60 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
25f70 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
25f80 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25f90 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
25fa0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
25fb0 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
25fc0 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
25fd0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
25fe0 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
25ff0 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
26000 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
26010 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
26020 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
26030 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
26040 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
26050 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
26060 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
26070 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
26080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26090 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
260a0 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
260b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
260c0 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
260d0 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
260e0 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
260f0 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
26100 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
26110 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
26120 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
26130 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
26140 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
26150 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
26160 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
26170 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
26180 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
26190 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
261a0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
261b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
261c0 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
261d0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
261e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
261f0 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
26200 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
26210 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
26220 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
26230 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
26240 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
26250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
26270 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
26280 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
26290 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
262a0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
262b0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
262c0 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
262d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
262e0 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
262f0 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
26300 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
26310 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
26320 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
26330 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
26340 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
26350 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
26360 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
26370 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
26380 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
26390 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
263a0 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
263b0 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
263c0 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
263d0 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
263e0 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
263f0 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
26400 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
26410 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
26420 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
26430 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
26440 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
26450 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
26460 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
26470 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
26480 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
26490 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
264a0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
264b0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
264c0 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
264d0 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
264e0 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
264f0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
26500 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
26510 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
26520 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
26530 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
26540 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
26550 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
26560 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
26570 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
26580 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
26590 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
265a0 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
265b0 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
265c0 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
265d0 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
265e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
265f0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
26600 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
26610 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
26620 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
26630 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
26640 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
26650 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
26660 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
26670 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
26680 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
26690 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
266a0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
266b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
266c0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
266d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
266e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
266f0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
26700 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
26710 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
26720 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
26730 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
26740 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
26750 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
26760 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
26770 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
26780 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
26790 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
267a0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
267b0 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
267c0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
267d0 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
267e0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
267f0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
26800 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
26810 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
26820 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
26830 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
26840 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
26850 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
26860 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
26870 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
26880 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68    */.  szScratch
26890 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
268a0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
268d0 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
268e0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
26910 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44  */.     + (ROUND
26920 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
26930 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ))+pBt->pageSize
26940 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a  )*NB  /* aCopy *
26950 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
26960 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
26990 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54  */.     + (ISAUT
269a0 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65  OVACUUM ? nMaxCe
269b0 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20  lls : 0);       
269c0 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a        /* aFrom *
269d0 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
269e0 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
269f0 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
26a00 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
26a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
26a20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
26a30 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26a40 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
26a50 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
26a60 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
26a70 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29  aCopy[0] = (u8*)
26a80 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
26a90 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  s];.  assert( ((
26aa0 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29  aCopy[0] - (u8*)
26ab0 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
26ac0 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
26ad0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
26ae0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
26af0 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43  NB; i++){.    aC
26b00 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b  opy[i] = &aCopy[
26b10 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  i-1][pBt->pageSi
26b20 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
26b30 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20  (MemPage))];.   
26b40 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
26b50 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [i] - (u8*)apCel
26b60 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
26b70 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
26b80 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
26b90 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61  }.  aSpace1 = &a
26ba0 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
26bb0 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
26bc0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
26bd0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
26be0 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70  Space1 - (u8*)ap
26bf0 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
26c00 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
26c10 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
26c20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26c30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26c40 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
26c50 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72  acuum ){.    aFr
26c60 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
26c70 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
26c80 7d 0a 23 65 6e 64 69 66 0a 20 20 61 53 70 61 63  }.#endif.  aSpac
26c90 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e2 = sqlite3Page
26ca0 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65  Malloc(pBt->page
26cb0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70  Size);.  if( aSp
26cc0 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ace2==0 ){.    r
26cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26ce0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
26cf0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
26d00 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
26d10 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
26d20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
26d30 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
26d40 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
26d50 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
26d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
26d70 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
26d80 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
26d90 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
26da0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
26db0 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
26dc0 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
26dd0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
26de0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
26df0 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
26e00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
26e10 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
26e20 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
26e30 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
26e40 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65  aCopy[i];.    me
26e50 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d  mcpy(p, apOld[i]
26e60 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  , sizeof(MemPage
26e70 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ));.    p->aData
26e80 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b   = (void*)&p[1];
26e90 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
26ea0 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
26eb0 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
26ec0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
26ed0 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
26ee0 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
26ef0 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
26f00 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
26f10 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
26f20 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
26f30 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
26f40 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
26f50 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
26f60 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
26f70 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61  tained form aSpa
26f80 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
26f90 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
26fa0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
26fb0 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
26fc0 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
26fd0 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
26fe0 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
26ff0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
27000 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
27010 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
27020 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
27030 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
27040 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
27050 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
27060 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
27070 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
27080 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
27090 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
270a0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
270b0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
270c0 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
270d0 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
270e0 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
270f0 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
27100 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
27110 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
27120 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
27130 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
27140 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
27150 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
27160 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
27170 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
27180 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
27190 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
271a0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
271b0 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
271c0 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
271d0 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
271e0 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
271f0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
27200 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
27210 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
27220 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
27230 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
27240 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
27250 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
27260 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
27270 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
27280 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
27290 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
272a0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
272b0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
272c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
272d0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
272e0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
272f0 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
27300 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
27310 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
27320 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
27330 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
27340 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27350 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
27360 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
27370 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
27380 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
27390 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
273a0 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
273b0 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
273c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
273d0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
273e0 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
273f0 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
27400 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27410 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
27420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27440 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
27450 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
27460 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
27470 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31  ld-1 ){.      u1
27480 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  6 sz = cellSizeP
27490 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
274a0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
274b0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
274c0 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
274d0 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
274e0 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
274f0 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
27500 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
27510 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
27520 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
27530 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
27540 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
27550 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
27560 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
27570 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
27580 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
27590 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
275a0 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
275b0 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
275c0 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
275d0 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
275e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
275f0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
27600 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
27610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27620 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
27630 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27640 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
27650 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
27660 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
27670 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
27680 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
27690 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  1];.        iSpa
276a0 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
276b0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
276c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
276d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
276e0 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
276f0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
27700 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
27710 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
27720 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
27730 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
27740 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23  eafCorrection;.#
27750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27760 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
27770 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
27780 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
27790 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
277a0 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
277b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
277c0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
277d0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
277e0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
277f0 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66  l[nCell] -= leaf
27800 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
27810 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
27820 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
27830 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
27840 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
27850 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
27860 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
27870 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
27880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
27890 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
278a0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
278b0 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
278c0 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
278d0 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
278e0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
278f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27900 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
27910 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
27920 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
27930 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
27940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
27950 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
27960 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
27970 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
27980 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
27990 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
279a0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
279b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
279c0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
279d0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
279e0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
279f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27a00 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
27a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27a20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
27a30 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
27a40 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
27a50 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
27a60 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
27a70 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
27a80 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
27a90 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
27aa0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
27ab0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
27ac0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
27ad0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
27ae0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
27af0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
27b00 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
27b10 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
27b20 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
27b30 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
27b40 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
27b50 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
27b60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
27b70 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
27b80 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
27b90 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
27ba0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
27bb0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
27bc0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
27bd0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
27be0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
27bf0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
27c00 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
27c10 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
27c20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
27c30 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
27c40 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
27c50 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
27c60 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
27c70 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
27c80 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
27c90 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
27ca0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
27cb0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
27cc0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
27cd0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
27ce0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
27cf0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
27d00 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
27d10 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
27d20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
27d30 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
27d40 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
27d50 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
27d60 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
27d70 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
27d80 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
27d90 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
27da0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
27db0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
27dc0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
27dd0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
27de0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
27df0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
27e00 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
27e10 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
27e20 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
27e30 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
27e40 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
27e50 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
27e60 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
27e70 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
27e80 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
27e90 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
27ea0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
27eb0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
27ec0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
27ed0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
27ee0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
27ef0 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
27f00 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
27f10 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
27f20 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
27f30 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
27f40 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
27f50 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
27f60 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
27f70 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
27f80 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
27f90 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
27fa0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
27fb0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
27fc0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
27fd0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
27fe0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
27ff0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
28000 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
28010 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
28020 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
28030 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
28040 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
28050 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
28060 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
28070 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
28080 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
28090 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
280a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
280b0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
280c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
280d0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
280e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
280f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28100 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
28110 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
28120 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
28130 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
28140 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
28150 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
28160 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
28170 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
28180 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
28190 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
281a0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
281b0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
281c0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
281d0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
281e0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
281f0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
28200 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
28210 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
28220 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
28230 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
28240 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
28250 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
28260 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
28270 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
28280 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
28290 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
282a0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
282b0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
282c0 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
282d0 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
282e0 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
282f0 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
28300 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
28310 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
28320 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
28330 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
28340 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
28350 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28360 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
28370 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
28380 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
28390 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
283a0 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
283b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
283c0 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
283d0 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
283e0 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
283f0 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
28400 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
28410 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
28420 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
28430 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
28440 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28450 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
28460 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
28470 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
28480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
28490 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
284a0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
284b0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
284c0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
284d0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
284e0 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
284f0 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
28500 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
28510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28520 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
28530 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28540 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
28550 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28560 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28580 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
28590 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
285a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
285b0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
285c0 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
285d0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
285e0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
285f0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28600 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
28610 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
28620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28630 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
28640 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
28650 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
28660 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
28670 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
28680 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
28690 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
286a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
286b0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
286c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
286d0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
286e0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
286f0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
28700 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
28710 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
28720 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
28730 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
28740 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
28750 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
28760 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
28770 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
28780 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
28790 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
287a0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
287b0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
287c0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
287d0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
287e0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
287f0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
28800 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
28810 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
28820 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
28830 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
28840 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
28850 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
28860 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
28870 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
28880 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
28890 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
288a0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
288b0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
288c0 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
288d0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
288e0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
288f0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
28900 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
28910 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
28920 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
28930 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
28940 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
28950 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
28960 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
28970 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
28980 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
28990 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
289a0 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
289b0 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
289c0 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
289d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
289e0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
289f0 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
28a00 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
28a10 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
28a20 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
28a30 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
28a40 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
28a50 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
28a60 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
28a70 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
28a80 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
28a90 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
28aa0 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
28ab0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
28ac0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
28ad0 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
28ae0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
28af0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
28b00 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
28b10 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
28b20 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
28b30 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
28b40 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
28b50 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
28b60 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
28b70 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
28b80 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
28b90 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
28ba0 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
28bb0 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
28bc0 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
28bd0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
28be0 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
28bf0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
28c00 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
28c10 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
28c20 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
28c30 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
28c40 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
28c50 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
28c60 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
28c70 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
28c80 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
28c90 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
28ca0 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
28cb0 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
28cc0 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
28cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
28ce0 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
28cf0 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
28d00 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
28d10 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
28d20 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
28d30 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
28d40 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28d50 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
28d60 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
28d70 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
28d80 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
28d90 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
28da0 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
28db0 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
28dc0 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
28dd0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
28de0 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
28df0 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
28e00 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
28e10 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
28e20 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ==0 );..#ifndef 
28e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28e40 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66  VACUUM.    /* If
28e50 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
28e60 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
28e70 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
28e80 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
28e90 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
28ea0 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
28eb0 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
28ec0 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
28ed0 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
28ee0 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
28ef0 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
28f00 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
28f10 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
28f20 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
28f30 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
28f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28f50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
28f60 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a  ){.      for(k=j
28f70 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b  ; k<cntNew[i]; k
28f80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
28f90 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73  ert( k<nMaxCells
28fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28fb0 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c  aFrom[k]==0xFF |
28fc0 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b  | apCopy[aFrom[k
28fd0 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
28fe0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
28ff0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29000 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b  Ovfl(pNew, k-j);
29010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29020 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29030 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
29040 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29070 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
29080 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
29090 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
290a0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
290b0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
290c0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
290d0 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
290e0 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
290f0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
29100 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
29110 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
29120 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65  <nNew-1 && j<nCe
29130 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
29140 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
29150 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
29160 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
29170 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
29180 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
29190 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
291a0 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
291b0 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
291c0 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
291d0 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61 63  = &aSpace2[iSpac
291e0 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  e2];.      if( !
291f0 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
29200 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
29210 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
29220 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
29230 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
29240 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
29250 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
29260 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
29270 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
29280 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
29290 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
292a0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
292b0 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
292c0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
292d0 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
292e0 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
292f0 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
29300 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
29310 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
29320 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
29330 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
29340 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
29350 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
29360 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
29370 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
29380 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  --;.        sqli
29390 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
293a0 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
293b0 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
293c0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
293d0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c  emp;.        fil
293e0 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
293f0 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
29400 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
29410 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  sz);.        pTe
29420 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
29430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
29440 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
29450 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
29460 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
29470 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
29480 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
29490 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
294a0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
294b0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
294c0 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
294d0 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
294e0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
294f0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
29500 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
29510 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
29520 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
29530 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
29540 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
29550 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
29560 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
29570 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
29580 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
29590 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
295a0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
295b0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
295c0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
295d0 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
295e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
295f0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
29600 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
29610 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
29620 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
29630 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
29640 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
29650 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
29660 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
29670 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
29680 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
29690 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
296a0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
296b0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
296c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
296d0 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
296e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
296f0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
29700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
29710 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
29720 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
29730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29740 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b  .      iSpace2 +
29750 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
29760 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
29770 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
29780 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32   assert( iSpace2
29790 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
297a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
297b0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
297c0 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
297d0 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
297e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
297f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
29800 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29810 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
29820 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
29830 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70  Parent,nxDiv), p
29840 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  New->pgno);.#ifn
29850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29860 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
29870 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
29880 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
29890 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20  tabase, and not 
298a0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
298b0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
298c0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
298d0 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65  er map with an e
298e0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
298f0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
29900 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c   ** that the cel
29910 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20  l just inserted 
29920 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e  points to (if an
29930 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
29940 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
29950 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44  Vacuum && !leafD
29960 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
29970 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29980 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
29990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
299a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
299b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
299c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
299d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
299e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a  }.#endif.      j
299f0 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
29a00 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
29a10 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
29a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
29a30 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
29a40 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
29a50 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
29a60 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
29a70 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
29a80 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
29a90 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d  ], &apCopy[nOld-
29aa0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  1]->aData[8], 4)
29ab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
29ac0 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  v==pParent->nCel
29ad0 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  l+pParent->nOver
29ae0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52  flow ){.    /* R
29af0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29b00 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
29b10 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
29b20 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34  rent */.    put4
29b30 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29b40 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29b50 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
29b60 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
29b70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69  }else{.    /* Ri
29b80 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
29b90 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69   is the left chi
29ba0 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ld of the first 
29bb0 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74  entry in pParent
29bc0 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
29bd0 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69   right-most divi
29be0 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  der entry */.   
29bf0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
29c00 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
29c10 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f  nt, nxDiv), pgno
29c20 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
29c30 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  }..  /*.  ** Rep
29c40 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f  arent children o
29c50 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  f all cells..  *
29c60 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
29c70 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
29c80 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
29c90 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29  dPages(apNew[i])
29ca0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29cb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
29cc0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
29cd0 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72    }.  rc = repar
29ce0 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50  entChildPages(pP
29cf0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
29d00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
29d10 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29d20 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42  up;..  /*.  ** B
29d30 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
29d40 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
29d50 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
29d60 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
29d70 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
29d80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
29d90 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
29da0 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
29db0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
29dc0 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
29dd0 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
29de0 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
29df0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29e00 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
29e10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72   );.  sqlite3Scr
29e20 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
29e30 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a  ;.  apCell = 0;.
29e40 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
29e50 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20  Parent, 0);.  . 
29e60 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
29e70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
29e80 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
29e90 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
29ea0 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63  e3PageFree(aSpac
29eb0 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  e2);.  sqlite3Sc
29ec0 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
29ed0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29ee0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
29ef0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
29f00 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
29f10 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
29f20 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
29f30 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
29f40 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
29f50 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
29f60 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
29f70 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
29f80 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
29f90 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
29fa0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
29fb0 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
29fc0 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
29fd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
29fe0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
29ff0 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2a000 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2a010 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2a020 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2a030 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2a040 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2a050 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2a060 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2a070 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2a080 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2a090 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
2a0a0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2a0b0 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2a0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a0d0 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
2a0e0 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
2a0f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2a100 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2a110 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
2a120 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
2a130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a140 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
2a150 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2a160 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2a170 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a190 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
2a1a0 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
2a1b0 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
2a1c0 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
2a1d0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2a1e0 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
2a1f0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2a200 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2a210 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2a220 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
2a230 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2a240 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2a270 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
2a280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a290 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
2a2a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2a2b0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2a2c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a2d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2a2e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a2f0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2a300 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
2a310 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
2a320 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
2a330 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65  ite3Malloc( mxCe
2a340 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
2a350 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
2a360 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
2a370 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2a380 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a390 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2a3a0 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
2a3b0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
2a3c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a3d0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
2a3e0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2a3f0 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
2a400 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
2a410 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
2a420 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
2a430 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
2a440 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2a450 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
2a460 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
2a470 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
2a480 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
2a490 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
2a4a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
2a4b0 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
2a4c0 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2a4d0 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2a4e0 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2a4f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2a500 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2a510 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
2a520 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
2a530 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
2a540 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
2a550 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
2a560 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
2a570 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
2a580 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
2a590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
2a5a0 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
2a5b0 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
2a5c0 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
2a5d0 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2a5e0 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
2a5f0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
2a600 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
2a610 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
2a620 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
2a630 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
2a640 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
2a650 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
2a660 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
2a670 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
2a680 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
2a690 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
2a6a0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
2a6b0 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2a6c0 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
2a6d0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2a6e0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2a6f0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2a700 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
2a710 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2a720 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2a730 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
2a740 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2a750 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20  e->pBt->pPager) 
2a760 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2a770 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2a780 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
2a790 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20  Child, &pChild, 
2a7a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2a7b0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2a7c0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69  w_balance;.    i
2a7d0 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  f( pPage->pgno==
2a7e0 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
2a7f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2a800 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61  Page(pChild, pPa
2a810 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2a820 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
2a830 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
2a840 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
2a850 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ld->nOverflow==0
2a860 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
2a870 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30  hild->nFree>=100
2a880 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2a890 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61  he child informa
2a8a0 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tion will fit on
2a8b0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
2a8c0 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20  so do the.      
2a8d0 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20    ** copy */.   
2a8e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2a8f0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2a900 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2a910 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  a[0]);.        f
2a920 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2a930 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2a940 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b           apCell[
2a950 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43  i] = findCell(pC
2a960 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20  hild,i);.       
2a970 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63     szCell[i] = c
2a980 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c  ellSizePtr(pChil
2a990 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20  d, apCell[i]);. 
2a9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a9b0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50   assemblePage(pP
2a9c0 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65  age, pChild->nCe
2a9d0 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65  ll, apCell, szCe
2a9e0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll);.        /* 
2a9f0 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70  Copy the right-p
2aa00 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2aa10 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ild to the paren
2aa20 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  t. */.        pu
2aa30 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2aa40 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2aa50 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20  ffset+8], .     
2aa60 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
2aa70 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70  &pChild->aData[p
2aa80 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  Child->hdrOffset
2aa90 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66  +8]));.        f
2aaa0 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2aab0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2aac0 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
2aad0 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70  %d transfer to p
2aae0 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2aaf0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2ab00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2ab10 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20  * The child has 
2ab20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2ab30 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f   that will fit o
2ab40 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20  n the root..    
2ab50 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20      ** The tree 
2ab60 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e  is already balan
2ab70 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67  ced.  Do nothing
2ab80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41  . */.        TRA
2ab90 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2aba0 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20  ild %d will not 
2abb0 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22  fit on page 1\n"
2abc0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2abd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2abe0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
2abf0 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  y(pPage->aData, 
2ac00 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70  pChild->aData, p
2ac10 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2ac20 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
2ac30 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2ac40 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
2ac50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
2ac60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ac70 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
2ac80 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
2ac90 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2aca0 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
2acb0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2acc0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2acd0 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
2ace0 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
2acf0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2ad00 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
2ad10 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
2ad20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2ad30 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
2ad40 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ges(pPage);.    
2ad50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ad60 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23  Overflow==0 );.#
2ad70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ad80 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2ad90 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2ada0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69  acuum ){.      i
2adb0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
2adc0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2add0 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  ell; i++){ .    
2ade0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2adf0 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29  utOvfl(pPage, i)
2ae00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ae10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ae20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2ae30 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2ae40 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2ae50 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2ae60 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  f.    releasePag
2ae70 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65  e(pChild);.  }.e
2ae80 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2ae90 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ce:.  sqlite3_fr
2aea0 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65  ee(apCell);.  re
2aeb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2aec0 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
2aed0 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a   is overfull.**.
2aee0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70  ** When this hap
2aef0 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e  pens, Create a n
2af00 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e  ew child page an
2af10 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f  d copy the.** co
2af20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
2af30 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ot into the chil
2af40 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68  d.  Then make th
2af50 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61  e root.** page a
2af60 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
2af70 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69  h rightChild poi
2af80 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nting to the new
2af90 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e  .** child.   Fin
2afa0 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  ally, call balan
2afb0 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e  ce_internal() on
2afc0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a   the new child.*
2afd0 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f  * to cause it to
2afe0 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   split..*/.stati
2aff0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
2b000 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  eper(MemPage *pP
2b010 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  age){.  int rc; 
2b020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b030 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
2b040 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
2b050 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
2b060 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ild;    /* Point
2b070 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
2b080 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
2b090 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
2b0a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2b0b0 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
2b0c0 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
2b0d0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2b0e0 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
2b0f0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
2b100 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2b110 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61  usable size of a
2b120 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64   page */.  u8 *d
2b130 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
2b140 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2b150 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   parent page */.
2b160 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20    u8 *cdata;    
2b170 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2b180 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
2b190 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ge */.  int hdr;
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b1b0 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
2b1c0 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a  ader in parent *
2b1d0 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20  /.  int brk;    
2b1e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2b1f0 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t to content of 
2b200 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61  first cell in pa
2b210 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rent */..  asser
2b220 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  t( pPage->pParen
2b230 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
2b240 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2b250 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  ow>0 );.  pBt = 
2b260 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
2b270 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b280 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2b290 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61  tex) );.  rc = a
2b2a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2b2b0 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26  (pBt, &pChild, &
2b2c0 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65  pgnoChild, pPage
2b2d0 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66  ->pgno, 0);.  if
2b2e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b2f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b300 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b310 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
2b320 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  age) );.  usable
2b330 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2b340 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
2b350 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2b360 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2b370 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d  rOffset;.  brk =
2b380 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2b390 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
2b3a0 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
2b3b0 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
2b3c0 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
2b3d0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
2b3e0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
2b3f0 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
2b400 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61  data[brk], &data
2b410 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  [brk], usableSiz
2b420 65 2d 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 43  e-brk);.  if( pC
2b430 68 69 6c 64 2d 3e 69 73 49 6e 69 74 20 29 20 72  hild->isInit ) r
2b440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b450 52 55 50 54 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RUPT;.  rc = sql
2b460 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2b470 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2b480 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2b490 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2b4a0 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
2b4b0 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
2b4c0 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
2b4d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2b4e0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2b4f0 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
2b500 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2b510 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2b520 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2b530 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
2b540 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2b550 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b560 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2b570 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
2b580 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2b590 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2b5a0 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2b5b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2b5c0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2b5d0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b5e0 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
2b5f0 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2b600 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2b610 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2b620 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2b630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b640 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b650 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b660 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
2b670 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
2b680 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
2b690 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
2b6a0 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
2b6b0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2b6c0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2b6d0 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
2b6e0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2b6f0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2b700 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b710 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
2b720 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
2b730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b740 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2b750 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2b760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b770 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62  .#endif.  rc = b
2b780 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2b790 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65  Child);..balance
2b7a0 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65  deeper_out:.  re
2b7b0 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2b7c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b7d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20  }../*.** Decide 
2b7e0 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61 67  if the page pPag
2b7f0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
2b800 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61  lanced.  If bala
2b810 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75  ncing is.** requ
2b820 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61  ired, call the a
2b830 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
2b840 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  cing routine..*/
2b850 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2b860 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  nce(MemPage *pPa
2b870 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b  ge, int insert){
2b880 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b890 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2b8a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b8b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b8c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2b8d0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2b8e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2b8f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b900 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2b910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b920 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2b930 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
2b940 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2b950 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 29  ce_deeper(pPage)
2b960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b980 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2b990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2b9a0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2b9b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2b9c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2b9d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b9e0 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  >0 || .        (
2b9f0 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67 65  !insert && pPage
2ba00 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70  ->nFree>pPage->p
2ba10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2ba20 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  /3) ){.      rc 
2ba30 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2ba40 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  t(pPage);.    }.
2ba50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ba60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ba70 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2ba80 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2ba90 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2baa0 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2bab0 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2bac0 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2bad0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2bae0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2baf0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2bb00 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2bb10 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2bb20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2bb30 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2bb40 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2bb50 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2bb60 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2bb70 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2bb80 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2bb90 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2bba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2bbb0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2bbc0 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
2bbd0 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
2bbe0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
2bbf0 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
2bc00 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20  Flag==1 and .** 
2bc10 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2bc20 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e  ==1 are also con
2bc30 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63  sidered 'read' c
2bc40 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e  ursors. Incremen
2bc50 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72  tal .** blob cur
2bc60 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
2bc70 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
2bc80 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
2bc90 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
2bca0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
2bcb0 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
2bcc0 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
2bcd0 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
2bce0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
2bcf0 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
2bd00 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2bd10 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
2bd20 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
2bd30 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
2bd40 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
2bd50 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
2bd60 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2bd70 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
2bd80 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2bd90 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2bda0 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
2bdb0 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
2bdc0 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
2bdd0 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
2bde0 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
2bdf0 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
2be00 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2be10 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
2be20 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
2be30 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
2be40 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
2be50 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
2be60 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2be70 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
2be80 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
2be90 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
2bea0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2beb0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
2bec0 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
2bed0 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2bee0 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
2bef0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
2bf00 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
2bf10 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
2bf20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
2bf30 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2bf40 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
2bf50 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
2bf60 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
2bf70 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
2bf80 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
2bf90 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
2bfa0 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
2bfb0 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
2bfc0 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
2bfd0 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
2bfe0 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
2bff0 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
2c000 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2c010 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
2c020 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
2c030 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2c040 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
2c050 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
2c060 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2c070 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
2c080 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
2c090 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
2c0a0 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
2c0b0 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
2c0c0 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2c0d0 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
2c0e0 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2c0f0 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70  ocks(.  Btree *p
2c100 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70  Btree, .  Pgno p
2c110 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75  gnoRoot, .  BtCu
2c120 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a  rsor *pExclude,.
2c130 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20    i64 iRow.){.  
2c140 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2c150 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2c160 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2c170 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2c180 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2c190 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2c1a0 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2c1b0 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2c1c0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2c1d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2c1e0 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2c1f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c200 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2c210 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2c220 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2c230 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2c240 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2c250 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2c260 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2c270 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2c280 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2c290 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2c2a0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2c2b0 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2c2c0 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2c2d0 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2c2e0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2c2f0 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2c300 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2c310 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c320 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c330 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2c340 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2c350 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2c360 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2c370 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2c380 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2c390 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2c3a0 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2c3b0 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
2c3c0 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
2c3d0 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
2c3e0 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
2c3f0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
2c400 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
2c410 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2c420 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2c430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c440 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2c450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c460 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2c470 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2c480 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2c490 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2c4a0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2c4b0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2c4c0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2c4d0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2c4e0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2c4f0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2c500 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2c510 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2c520 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2c530 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2c540 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2c550 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2c560 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2c570 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2c580 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2c590 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2c5a0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2c5b0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2c5c0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2c5d0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2c5e0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2c5f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c600 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2c610 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2c620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c630 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2c640 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2c650 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2c660 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2c670 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2c680 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2c690 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2c6a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2c6b0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2c6c0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2c6d0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2c6e0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c700 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2c710 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2c720 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2c730 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c750 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c760 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2c770 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2c780 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2c790 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2c7a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2c7b0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2c7c0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2c7d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2c7e0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2c7f0 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2c800 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2c810 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2c820 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2c830 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2c840 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2c850 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2c860 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2c870 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2c880 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2c890 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2c8a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2c8b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2c8c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2c8d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2c8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c8f0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2c900 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2c910 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2c920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c930 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2c940 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2c950 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2c960 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2c970 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2c980 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2c990 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79  Root, pCur, nKey
2c9a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2c9b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2c9c0 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2c9d0 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2c9e0 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2c9f0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2ca00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2ca10 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2ca20 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2ca30 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2ca40 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2ca50 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2ca60 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2ca70 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73  e */.  clearCurs
2ca80 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ca90 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2caa0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2cab0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2cac0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2cad0 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2cae0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2caf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2cb00 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2cb10 30 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  0, nKey, appendB
2cb20 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2cb30 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2cb40 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2cb50 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2cb60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2cb70 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
2cb80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2cb90 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
2cba0 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
2cbb0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2cbc0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2cbd0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2cbe0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2cbf0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2cc00 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2cc10 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2cc20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2cc30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2cc40 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2cc50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cc60 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
2cc70 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2cc80 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
2cc90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2cca0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2ccb0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2ccc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2ccd0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2cce0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2ccf0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2cd00 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2cd10 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2cd20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2cd30 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2cd40 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2cd50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2cd60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2cd70 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2cd80 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2cd90 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2cda0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2cdb0 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f  e ){.    u16 szO
2cdc0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2cdd0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2cde0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2cdf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
2ce00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ce10 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2ce20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2ce30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2ce40 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2ce50 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
2ce60 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2ce70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69  Cur->idx);.    i
2ce80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2ce90 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2cea0 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
2ceb0 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
2cec0 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
2ced0 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
2cee0 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
2cef0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
2cf00 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
2cf10 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2cf20 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43  nsert;.    dropC
2cf30 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2cf40 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20  >idx, szOld);.  
2cf50 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2cf60 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2cf70 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2cf80 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2cf90 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b      pCur->idx++;
2cfa0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
2cfb0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
2cfc0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
2cfd0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2cfe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2cff0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2d000 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2d010 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2d020 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2d030 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2d040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2d050 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2d060 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2d070 67 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ge, 1);.  if( rc
2d080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d090 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
2d0a0 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73  ur);.  }.end_ins
2d0b0 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
2d0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2d0d0 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
2d0e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
2d0f0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
2d100 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2d110 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2d120 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2d130 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d140 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
2d150 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2d160 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d170 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75  pCur->pPage;.  u
2d180 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2d190 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
2d1a0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
2d1b0 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  = 0;.  Btree *p 
2d1c0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
2d1d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2d1e0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
2d1f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2d200 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2d210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d220 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2d230 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2d240 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2d250 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2d260 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2d270 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2d280 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20  a delete */.    
2d290 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2d2a0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2d2b0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2d2c0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2d2d0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2d2e0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2d2f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2d300 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2d310 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2d320 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2d330 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   }.  if( pCur->i
2d340 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65  dx >= pPage->nCe
2d350 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
2d360 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
2d370 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
2d380 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
2d390 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
2d3a0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2d3b0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2d3c0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2d3d0 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65    /* Did not ope
2d3e0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f  n this cursor fo
2d3f0 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2d400 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2d410 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72  Locks(pCur->pBtr
2d420 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
2d430 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e  ot, pCur, pCur->
2d440 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20  info.nKey) ){.  
2d450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d460 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2d470 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2d480 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2d490 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ock */.  }..  /*
2d4a0 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
2d4b0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2d4c0 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66  tion (a no-op if
2d4d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
2d4e0 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53  ot in .  ** CURS
2d4f0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
2d500 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74  tate) and save t
2d510 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
2d520 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
2d530 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20  s .  ** open on 
2d540 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
2d550 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  Then call sqlite
2d560 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
2d570 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74   the page.  ** t
2d580 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69  hat the entry wi
2d590 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72  ll be deleted fr
2d5a0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  om..  */.  if( .
2d5b0 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72      (rc = restor
2d5c0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2d5d0 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20  pCur))!=0 ||.   
2d5e0 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75   (rc = saveAllCu
2d5f0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
2d600 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2d610 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2d620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d630 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2d640 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ge))!=0.  ){.   
2d650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d660 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
2d670 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73   cell within its
2d680 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20   page and leave 
2d690 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74  pCell pointing t
2d6a0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e  o the.  ** data.
2d6b0 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29   The clearCell()
2d6c0 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20   call frees any 
2d6d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2d6e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2d6f0 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68  he.  ** cell. Th
2d700 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73  e cell itself is
2d710 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20   still intact.. 
2d720 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   */.  pCell = fi
2d730 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2d740 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20  ur->idx);.  if( 
2d750 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d760 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
2d770 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
2d780 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61  .  }.  rc = clea
2d790 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2d7a0 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ll);.  if( rc ){
2d7b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2d7c0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
2d7d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2d7e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
2d7f0 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
2d800 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
2d810 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
2d820 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
2d830 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
2d840 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
2d850 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
2d860 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
2d870 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
2d880 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
2d890 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
2d8a0 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
2d8b0 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
2d8c0 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
2d8d0 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
2d8e0 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
2d8f0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
2d900 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
2d910 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
2d920 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
2d930 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67  afCur;.    unsig
2d940 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b  ned char *pNext;
2d950 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
2d960 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2d970 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20  har *tempCell = 
2d980 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
2d990 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2d9a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
2d9b0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
2d9c0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
2d9d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d9e0 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
2d9f0 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
2da00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2da10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2da20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2da30 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70  rWrite(leafCur.p
2da40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2da50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2da60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2da70 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b       u16 szNext;
2da80 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2da90 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2daa0 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2dab0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2dac0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2dad0 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2dae0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2daf0 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2db00 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2db10 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2db20 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2db30 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2db40 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2db50 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2db60 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2db70 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2db80 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2db90 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2dba0 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2dbb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2dbc0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2dbd0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2dbe0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2dbf0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2dc00 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2dc10 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2dc20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2dc30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2dc40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2dc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dc60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dc70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2dc80 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2dc90 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2dca0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2dcb0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2dcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dcd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2dce0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
2dcf0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2dd00 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2dd10 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64  >idx), pgnoChild
2dd20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2dd30 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2dd40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2dd50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dd60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72  OK ){.        dr
2dd70 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2dd80 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2dd90 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2dda0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2ddb0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2ddc0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2ddd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
2dde0 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
2ddf0 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2de00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2de10 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2de20 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2de30 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2de40 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2de50 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2de60 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2de70 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2de80 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2de90 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2dea0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2deb0 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2dec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ded0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2dee0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2def0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2df00 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2df10 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2df20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2df30 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2df40 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2df50 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2df60 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2df70 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2df80 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2df90 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2dfa0 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2dfb0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2dfc0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2dfd0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2dfe0 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2dff0 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2e000 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2e010 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2e020 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2e030 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2e040 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2e050 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2e060 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2e070 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2e080 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2e090 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2e0a0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2e0b0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2e0c0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2e0d0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2e0e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e0f0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2e100 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2e110 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2e120 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2e130 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2e140 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2e150 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2e160 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2e170 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2e180 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2e190 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2e1a0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2e1b0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2e1c0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2e1d0 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2e1e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2e1f0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2e200 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ly );..#ifdef SQ
2e210 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2e220 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2e230 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2e240 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2e250 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2e260 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2e270 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73  urn rc;.  }.#els
2e280 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
2e290 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
2e2a0 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
2e2b0 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
2e2c0 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
2e2d0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
2e2e0 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
2e2f0 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
2e300 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2e310 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
2e320 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
2e330 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
2e340 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
2e350 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
2e360 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2e370 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2e380 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
2e390 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
2e3a0 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
2e3b0 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
2e3c0 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
2e3d0 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
2e3e0 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
2e3f0 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
2e400 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
2e410 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
2e420 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
2e430 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
2e440 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
2e450 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
2e460 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
2e470 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
2e480 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
2e490 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
2e4a0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2e4b0 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
2e4c0 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
2e4d0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2e4e0 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
2e4f0 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
2e500 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
2e510 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
2e520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e530 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2e540 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
2e550 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2e570 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2e580 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2e590 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2e5a0 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2e5b0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2e5c0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2e5d0 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2e5e0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2e5f0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2e600 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74   while( pgnoRoot
2e610 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2e620 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
2e630 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
2e640 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
2e650 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2e660 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2e670 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2e680 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
2e690 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2e6a0 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
2e6b0 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
2e6c0 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
2e6d0 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
2e6e0 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
2e6f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2e700 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
2e710 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
2e720 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
2e730 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
2e740 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2e750 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2e760 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
2e770 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
2e780 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
2e790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e7a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2e7b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2e7c0 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
2e7d0 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
2e7e0 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
2e7f0 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
2e800 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
2e810 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2e820 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2e830 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
2e840 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
2e850 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
2e860 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
2e870 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
2e880 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
2e890 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
2e8a0 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
2e8b0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
2e8c0 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
2e8d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2e8e0 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
2e8f0 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
2e900 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
2e910 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
2e920 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2e930 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2e940 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2e950 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2e960 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
2e970 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
2e980 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
2e990 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
2e9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e9b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2e9c0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2e9d0 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
2e9e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e9f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2ea00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ea10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2ea20 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
2ea30 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
2ea40 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
2ea50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ea60 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2ea70 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
2ea80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2ea90 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2eaa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2eab0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2eac0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2ead0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2eae0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
2eaf0 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
2eb00 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2eb10 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
2eb20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2eb30 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
2eb40 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
2eb50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eb60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eb70 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2eb80 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2eb90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2eba0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2ebb0 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
2ebc0 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
2ebd0 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20  ge, pgnoMove);. 
2ebe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ebf0 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20  (pRoot);..      
2ec00 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61  /* Obtain the pa
2ec10 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a  ge at pgnoRoot *
2ec20 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  /.      if( rc!=
2ec30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ec40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ec50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2ec60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2ec70 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
2ec80 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
2ec90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2eca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ecb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ecc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2ecd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ece0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
2ecf0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2ed00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ed10 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ed20 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2ed30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ed40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ed50 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  e{.      pRoot =
2ed60 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20   pPageMove;.    
2ed70 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  } ..    /* Updat
2ed80 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
2ed90 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20  p and meta-data 
2eda0 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f  with the new roo
2edb0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a  t-page number. *
2edc0 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  /.    rc = ptrma
2edd0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pPut(pBt, pgnoRo
2ede0 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ot, PTRMAP_ROOTP
2edf0 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
2ee00 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
2ee10 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2ee20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ee30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2ee40 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2ee50 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67  ateMeta(p, 4, pg
2ee60 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2ee70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
2ee80 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2ee90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2eea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
2eeb0 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
2eec0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2eed0 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2eee0 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  oot, 1, 0);.    
2eef0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ef00 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
2ef10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ef20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ef30 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2ef40 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
2ef50 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
2ef60 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
2ef70 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f  e3PagerUnref(pRo
2ef80 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2ef90 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29  *piTable = (int)
2efa0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75  pgnoRoot;.  retu
2efb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2efc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2efd0 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
2efe0 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
2eff0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2f000 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2f010 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
2f020 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
2f030 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
2f040 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2f050 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67  p, piTable, flag
2f060 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
2f070 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
2f080 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f090 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2f0a0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2f0b0 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2f0c0 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2f0d0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2f0e0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2f0f0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2f100 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2f110 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2f120 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2f130 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2f140 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2f150 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2f160 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2f170 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2f180 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2f190 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2f1a0 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2f1b0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2f1c0 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2f1d0 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2f1e0 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2f1f0 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2f200 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2f210 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2f220 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2f230 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
2f240 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f250 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f260 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
2f270 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
2f280 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
2f290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f2a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f2b0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2f2c0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2f2d0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70   pgno, &pPage, p
2f2e0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2f2f0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2f300 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2f310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2f320 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
2f330 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2f340 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2f350 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2f360 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2f370 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2f380 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2f390 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67  yte(pCell), pPag
2f3a0 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2f3b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2f3c0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2f3d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2f3e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2f3f0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2f400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f410 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2f420 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
2f430 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f440 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
2f450 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2f460 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
2f470 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
2f480 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2f490 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
2f4a0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2f4b0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2f4c0 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
2f4d0 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
2f4e0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2f4f0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
2f500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f510 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2f520 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
2f530 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2f540 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
2f550 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
2f560 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
2f570 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
2f580 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2f590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f5a0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
2f5b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
2f5c0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
2f5d0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f5e0 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
2f5f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f600 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
2f610 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
2f620 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
2f630 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
2f640 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2f650 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
2f660 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
2f670 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
2f680 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
2f690 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
2f6a0 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
2f6b0 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
2f6c0 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
2f6d0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
2f6e0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
2f6f0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2f700 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
2f710 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
2f720 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2f730 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72  iTable){.  int r
2f740 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
2f750 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
2f760 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2f770 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
2f780 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
2f790 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2f7a0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2f7b0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2f7c0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2f7d0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2f7e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2f7f0 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
2f800 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ks(p, iTable, 0,
2f810 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   1))!=SQLITE_OK 
2f820 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
2f830 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2f840 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  se if( SQLITE_OK
2f850 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2f860 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62  ursors(pBt, iTab
2f870 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f  le, 0)) ){.    /
2f880 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
2f890 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
2f8a0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2f8b0 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  sePage(pBt, (Pgn
2f8c0 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b  o)iTable, 0, 0);
2f8d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
2f8e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
2f8f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f900 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
2f910 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
2f920 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
2f930 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
2f940 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
2f950 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
2f960 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
2f970 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
2f980 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
2f990 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
2f9a0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2f9b0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
2f9c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
2f9d0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
2f9e0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
2f9f0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
2fa00 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2fa10 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
2fa20 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
2fa30 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
2fa40 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
2fa50 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
2fa60 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
2fa70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2fa80 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
2fa90 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
2faa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2fab0 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
2fac0 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
2fad0 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
2fae0 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
2faf0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
2fb00 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
2fb10 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
2fb20 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
2fb30 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
2fb40 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
2fb50 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
2fb60 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
2fb70 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
2fb80 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2fb90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
2fba0 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
2fbb0 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
2fbc0 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
2fbd0 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
2fbe0 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
2fbf0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
2fc00 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
2fc10 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
2fc20 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
2fc30 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
2fc40 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
2fc50 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
2fc60 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
2fc70 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2fc80 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
2fc90 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
2fca0 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
2fcb0 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
2fcc0 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
2fcd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2fce0 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
2fcf0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
2fd00 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
2fd10 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
2fd20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2fd30 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
2fd40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
2fd50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fd60 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2fd70 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  (p) );.  if( p->
2fd80 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2fd90 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2fda0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2fdb0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2fdc0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2fdd0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  R;.  }..  /* It 
2fde0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72  is illegal to dr
2fdf0 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  op a table if an
2fe00 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
2fe10 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
2fe20 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
2fe30 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
2fe40 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
2fe50 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
2fe60 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
2fe70 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65  nother root-page
2fe80 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c   to fill a gap l
2fe90 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
2fea0 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  ed.  ** root pag
2feb0 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  e. If an open cu
2fec0 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
2fed0 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c  his page a probl
2fee0 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f  em would .  ** o
2fef0 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
2ff00 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
2ff10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ff20 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
2ff30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ff40 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ff50 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2ff60 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
2ff70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ff80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ff90 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
2ffa0 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   iTable);.  if( 
2ffb0 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
2ffc0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2ffd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ffe0 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
2fff0 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
30000 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
30010 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30020 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
30030 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30040 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
30050 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
30060 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
30070 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
30080 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
30090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
300a0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
300b0 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
300c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
300d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
300e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
300f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30110 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
30120 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
30130 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
30140 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
30150 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
30160 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
30170 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
30180 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
30190 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
301a0 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
301b0 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
301c0 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
301d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
301e0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
301f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
30200 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30210 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30230 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30240 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
30250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30260 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
30270 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
30280 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
30290 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
302a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
302b0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
302c0 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
302d0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
302e0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
302f0 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
30300 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
30310 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
30320 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
30330 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
30340 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30350 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
30360 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
30370 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
30380 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
30390 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
303a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
303b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
303c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
303d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
303e0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
303f0 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f  pMove, PTRMAP_RO
30400 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c  OTPAGE, 0, iTabl
30410 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
30420 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
30430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30450 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30480 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
30490 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
304a0 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
304b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
304c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
304d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
304e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
304f0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f  c = freePage(pMo
30500 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ve);.        rel
30510 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
30520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30550 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
30560 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20       *piMoved = 
30570 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
30580 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
30590 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d  et the new 'max-
305a0 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65  root-page' value
305b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
305c0 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20   header. This.  
305d0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c      ** is the ol
305e0 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65  d value less one
305f0 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20  , less one more 
30600 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20  if that happens 
30610 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61  to.      ** be a
30620 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
30630 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69  r, less one agai
30640 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65  n if that is the
30650 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  .      ** PENDIN
30660 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20  G_BYTE_PAGE..   
30670 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52     */.      maxR
30680 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
30690 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
306a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
306b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
306c0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
306d0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
306e0 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
306f0 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
30700 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
30710 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
30720 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
30730 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
30740 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50  ( maxRootPgno!=P
30750 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30760 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20  (pBt) );..      
30770 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30780 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
30790 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a  , maxRootPgno);.
307a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
307b0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
307c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Page);.      rel
307d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
307e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
307f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
30800 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
30810 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65  pTable was calle
30820 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  d on page 1. */.
30830 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
30840 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ge, PTF_INTKEY|P
30850 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72  TF_LEAF );.    r
30860 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30870 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
30880 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69  rc;  .}.int sqli
30890 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
308a0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
308b0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
308c0 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
308d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
308e0 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
308f0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
30900 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54   rc = btreeDropT
30910 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20  able(p, iTable, 
30920 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69  piMoved);.  sqli
30930 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30940 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
30950 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
30960 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
30970 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61  on out of a data
30980 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61  base file.  Meta
30990 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75  [0].** is the nu
309a0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
309b0 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
309c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
309d0 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67  eta[1].** throug
309e0 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61  h meta[15] are a
309f0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
30a00 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72   by higher layer
30a10 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  s.  Meta[0].** i
30a20 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
30a30 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64   others are read
30a40 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  /write..** .** T
30a50 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20  he schema layer 
30a60 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c  numbers meta val
30a70 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e  ues differently.
30a80 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a    At the schema.
30a90 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68  ** layer (and th
30aa0 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20  e SetCookie and 
30ab0 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64  ReadCookie opcod
30ac0 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  es) the number o
30ad0 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20  f.** free pages 
30ae0 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20  is not visible. 
30af0 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73   So Cookie[0] is
30b00 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74   the same as Met
30b10 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  a[1]..*/.int sql
30b20 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
30b30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
30b40 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b  dx, u32 *pMeta){
30b50 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
30b60 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ge;.  int rc;.  
30b70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
30b80 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
30b90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
30ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
30bb0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
30bc0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
30bd0 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64  Reading a meta-d
30be0 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69 72  ata value requir
30bf0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
30c00 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68 65  n page 1 (and he
30c10 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c  nce.  ** the sql
30c20 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
30c30 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20 6c  . We grab this l
30c40 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ock regardless o
30c50 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a  f whether or.  *
30c60 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45  * not the SQLITE
30c70 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
30c80 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74 68   flag is set (th
30c90 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
30ca0 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73  t page.  ** 1 is
30cb0 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73 70   treated as a sp
30cc0 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71 75  ecial case by qu
30cd0 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61  eryTableLock() a
30ce0 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e  nd lockTable()).
30cf0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  .  */.  rc = que
30d00 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31  ryTableLock(p, 1
30d10 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
30d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30d30 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
30d40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30d50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30d60 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  }..  assert( idx
30d70 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=0 && idx<=15 )
30d80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
30d90 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
30da0 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67  ager, 1, &pDbPag
30db0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
30dc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
30dd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
30de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
30df0 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
30e00 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
30e10 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
30e20 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67  e);.  *pMeta = g
30e30 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
30e40 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c  + idx*4]);.  sql
30e50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
30e60 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49  DbPage);..  /* I
30e70 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
30e80 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
30e90 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
30ea0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
30eb0 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
30ec0 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
30ed0 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
30ee0 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
30ef0 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
30f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30f10 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
30f20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
30f30 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
30f40 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
30f50 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65    /* Grab the re
30f60 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
30f70 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63  1. */.  rc = loc
30f80 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41  kTable(p, 1, REA
30f90 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  D_LOCK);.  sqlit
30fa0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
30fb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30fc0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74  ./*.** Write met
30fd0 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61  a-information ba
30fe0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
30ff0 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69  base.  Meta[0] i
31000 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61  s.** read-only a
31010 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72  nd may not be wr
31020 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  itten..*/.int sq
31030 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
31040 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
31050 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74  nt idx, u32 iMet
31060 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  a){.  BtShared *
31070 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
31080 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31090 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  P1;.  int rc;.  
310a0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26  assert( idx>=1 &
310b0 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73  & idx<=15 );.  s
310c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
310d0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
310e0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
310f0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
31100 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
31110 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
31120 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
31130 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
31140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
31150 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
31160 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31  e1!=0 );.    pP1
31170 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
31180 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
31190 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
311a0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
311b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
311c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
311d0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
311e0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
311f0 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64  ], iMeta);.#ifnd
31200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31210 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31220 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20  if( idx==7 ){.  
31230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
31240 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c  t->autoVacuum ||
31250 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20   iMeta==0 );.   
31260 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65       assert( iMe
31270 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d  ta==0 || iMeta==
31280 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74  1 );.        pBt
31290 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69  ->incrVacuum = i
312a0 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Meta;.      }.#e
312b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ndif.    }.  }. 
312c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
312d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
312e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
312f0 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
31300 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
31310 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
31320 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
31330 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
31340 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
31350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
31360 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
31370 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
31380 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53   What about CURS
31390 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
313a0 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e  tate? Probably n
313b0 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  eed to call.  **
313c0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
313d0 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
313e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
313f0 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43  Page;.  restoreC
31400 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
31410 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
31420 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
31430 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
31440 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
31450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31460 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
31470 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
31480 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
31490 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
314a0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
314b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
314c0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
314d0 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
314e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
314f0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
31500 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
31510 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
31520 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
31530 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
31540 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
31550 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
31560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31570 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
31580 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
31590 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
315a0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
315b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
315c0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
315d0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
315e0 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
315f0 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
31600 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
31610 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
31620 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  p;.  if( !pCheck
31630 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
31640 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
31650 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
31660 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
31670 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
31680 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
31690 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20  rMsg.nChar ){.  
316a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
316b0 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
316c0 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31  >errMsg, "\n", 1
316d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73  );.  }.  if( zMs
316e0 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g1 ){.    sqlite
316f0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
31700 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
31710 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d   zMsg1, -1);.  }
31720 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
31730 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  tf(&pCheck->errM
31740 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20  sg, 1, zFormat, 
31750 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
31760 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
31770 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31780 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
31790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
317a0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
317b0 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
317c0 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
317d0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
317e0 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
317f0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
31800 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31810 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
31820 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
31830 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
31840 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
31850 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
31860 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
31870 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
31880 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
31890 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
318a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
318b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
318c0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
318d0 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
318e0 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
318f0 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
31900 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
31910 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68  k, int iPage, ch
31920 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
31930 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
31940 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
31950 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
31960 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29  age || iPage<0 )
31970 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
31980 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31990 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
319a0 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
319b0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
319c0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
319d0 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
319e0 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
319f0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31a00 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31a10 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
31a20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
31a30 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
31a40 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
31a50 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
31a60 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
31a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31a80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
31a90 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
31aa0 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
31ab0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
31ac0 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
31ad0 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
31ae0 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
31af0 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
31b00 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
31b10 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
31b20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
31b30 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
31b40 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
31b50 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
31b60 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
31b70 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
31b80 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
31b90 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
31ba0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
31bb0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
31bc0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
31bd0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
31be0 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
31bf0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
31c00 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
31c10 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
31c20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
31c30 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
31c40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
31c50 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
31c60 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
31c70 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
31c80 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
31c90 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
31ca0 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
31cb0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
31cc0 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
31cd0 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
31ce0 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
31cf0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
31d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65  TE_OK ){.    che
31d10 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31d20 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46  ck, zContext, "F
31d30 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74  ailed to read pt
31d40 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43  rmap key=%d", iC
31d50 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
31d60 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50  n;.  }..  if( eP
31d70 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65  trmapType!=eType
31d80 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e   || iPtrmapParen
31d90 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20  t!=iParent ){.  
31da0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
31db0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
31dc0 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70  t, .      "Bad p
31dd0 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79  tr map entry key
31de0 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64  =%d expected=(%d
31df0 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29  ,%d) got=(%d,%d)
31e00 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64  ", .      iChild
31e10 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74  , eType, iParent
31e20 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69  , ePtrmapType, i
31e30 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
31e40 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
31e50 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  ** Check the int
31e60 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
31e70 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20  eelist or of an 
31e80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
31e90 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  st..** Verify th
31ea0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
31eb0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69   pages on the li
31ec0 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74  st is N..*/.stat
31ed0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73  ic void checkLis
31ee0 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  t(.  IntegrityCk
31ef0 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e   *pCheck,  /* In
31f00 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67  tegrity checking
31f10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
31f20 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20  t isFreeList,   
31f30 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
31f40 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c  a freelist.  Fal
31f50 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  se for overflow 
31f60 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69  page list */.  i
31f70 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
31f80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31f90 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61  ber for first pa
31fa0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  ge in the list *
31fb0 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
31fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
31fd0 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
31fe0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
31ff0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t */.  char *zCo
32000 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20  ntext        /* 
32010 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
32020 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b  r messages */.){
32030 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
32040 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20  expected = N;.  
32050 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61  int iFirst = iPa
32060 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ge;.  while( N--
32070 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e   > 0 && pCheck->
32080 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50  mxErr ){.    DbP
32090 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a  age *pOvflPage;.
320a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
320b0 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20  r *pOvflData;.  
320c0 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b    if( iPage<1 ){
320d0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
320e0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
320f0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
32100 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73   "%d of %d pages
32110 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76   missing from ov
32120 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72  erflow list star
32130 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20  ting at %d",.   
32140 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65         N+1, expe
32150 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20  cted, iFirst);. 
32160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32170 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
32180 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
32190 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72  , zContext) ) br
321a0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
321b0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68  ite3PagerGet(pCh
321c0 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
321d0 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c  no)iPage, &pOvfl
321e0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63  Page) ){.      c
321f0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32200 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
32210 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70  "failed to get p
32220 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
32230 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32240 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74    }.    pOvflDat
32250 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
32260 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
32270 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61  rGetData(pOvflPa
32280 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46  ge);.    if( isF
32290 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
322a0 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
322b0 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29  e(&pOvflData[4])
322c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
322d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
322e0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
322f0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
32300 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
32310 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
32320 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
32330 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
32340 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
32350 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
32360 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e   n>pCheck->pBt->
32370 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29  usableSize/4-2 )
32380 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
32390 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
323a0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
323b0 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20        "freelist 
323c0 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62  leaf count too b
323d0 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ig on page %d", 
323e0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
323f0 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  N--;.      }else
32400 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
32410 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
32420 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
32430 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  eePage = get4byt
32440 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69  e(&pOvflData[8+i
32450 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  *4]);.#ifndef SQ
32460 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32470 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69  CUUM.          i
32480 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
32490 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
324a0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50            checkP
324b0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46  trmap(pCheck, iF
324c0 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  reePage, PTRMAP_
324d0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
324e0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
324f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
32500 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43       checkRef(pC
32510 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
32520 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
32530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20      }.        N 
32540 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -= n;.      }.  
32550 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
32560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32570 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UM.    else{.   
32580 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61     /* If this da
32590 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
325a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20  auto-vacuum and 
325b0 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65  iPage is not the
325c0 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70   last.      ** p
325d0 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72  age in this over
325e0 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b  flow list, check
325f0 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
32600 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r-map entry for.
32610 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
32620 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63  lowing page matc
32630 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20  hes iPage..     
32640 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
32650 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
32660 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a  acuum && N>0 ){.
32670 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34          i = get4
32680 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
32690 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
326a0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
326b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
326c0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
326d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
326e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
326f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
32700 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71  vflData);.    sq
32710 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
32720 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a  pOvflPage);.  }.
32730 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
32740 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
32750 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
32760 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32770 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
32780 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
32790 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
327a0 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
327b0 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
327c0 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
327d0 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
327e0 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
327f0 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
32800 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
32810 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
32820 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
32830 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
32840 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
32850 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
32860 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
32870 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
32880 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
32890 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
328a0 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
328b0 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
328c0 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
328d0 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
328e0 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
328f0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
32900 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
32910 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
32920 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
32930 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
32940 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
32950 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
32960 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
32970 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
32980 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
32990 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
329a0 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
329b0 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
329c0 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
329d0 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
329e0 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
329f0 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
32a00 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
32a10 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
32a20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
32a30 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
32a40 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
32a50 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
32a60 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
32a70 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
32a80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
32a90 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
32aa0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
32ab0 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
32ac0 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
32ad0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
32ae0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
32af0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
32b00 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
32b10 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
32b20 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
32b30 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
32b40 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
32b50 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
32b60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
32b70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32b80 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
32b90 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
32ba0 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
32bb0 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
32bc0 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
32bd0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
32be0 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
32bf0 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
32c00 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
32c10 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69  ar *hit;..  sqli
32c20 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32c30 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
32c40 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
32c50 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
32c60 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
32c70 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
32c80 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65   */.  pBt = pChe
32c90 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c  ck->pBt;.  usabl
32ca0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
32cb0 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  bleSize;.  if( i
32cc0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
32cd0 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   0;.  if( checkR
32ce0 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
32cf0 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74  , zParentContext
32d00 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
32d10 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
32d20 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
32d30 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  t, (Pgno)iPage, 
32d40 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29  &pPage, 0))!=0 )
32d50 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
32d60 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32d70 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
32d80 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
32d90 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
32da0 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
32db0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
32dc0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
32dd0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
32de0 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21  Page, pParent))!
32df0 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
32e00 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32e10 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
32e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32e30 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
32e40 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65  Page() returns e
32e50 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72  rror code %d", r
32e60 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  c);.    releaseP
32e70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
32e80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
32e90 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c   /* Check out al
32ea0 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a  l the cells..  *
32eb0 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20  /.  depth = 0;. 
32ec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
32ed0 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65  e->nCell && pChe
32ee0 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  ck->mxErr; i++){
32ef0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
32f00 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
32f10 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
32f20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
32f30 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
32f40 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
32f50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32f60 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
32f70 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
32f80 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65           "On tre
32f90 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
32fa0 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
32fb0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
32fc0 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
32fd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
32fe0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
32ff0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
33000 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f  );.    sz = info
33010 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
33020 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
33030 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
33040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
33050 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
33060 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e  );.    if( sz>in
33070 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
33080 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28     int nPage = (
33090 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  sz - info.nLocal
330a0 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   + usableSize - 
330b0 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d  5)/(usableSize -
330c0 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20   4);.      Pgno 
330d0 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
330e0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
330f0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66  iOverflow]);.#if
33100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33110 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33120 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
33130 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
33140 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
33150 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  eck, pgnoOvfl, P
33160 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
33170 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
33180 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
33190 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  f.      checkLis
331a0 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e  t(pCheck, 0, pgn
331b0 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43  oOvfl, nPage, zC
331c0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
331d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e      /* Check san
331e0 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c  ity of left chil
331f0 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  d page..    */. 
33200 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
33210 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  eaf ){.      pgn
33220 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
33230 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
33240 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33250 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
33260 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
33270 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
33280 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
33290 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
332a0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
332b0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
332c0 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65  f.      d2 = che
332d0 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
332e0 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f  k,pgno,pPage,zCo
332f0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  ntext);.      if
33300 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
33310 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
33320 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33330 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
33340 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
33350 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
33360 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
33370 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
33380 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
33390 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
333a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
333b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
333c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
333d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
333e0 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
333f0 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  xt), zContext, .
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33410 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64       "On page %d
33420 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
33430 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
33440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33450 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33460 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33470 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
33480 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
33490 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
334a0 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
334b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
334c0 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
334d0 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
334e0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
334f0 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
33500 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
33510 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
33520 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
33530 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
33540 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
33550 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
33560 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
33570 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
33580 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a  );.  if( hit ){.
33590 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
335a0 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  0, usableSize );
335b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
335c0 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61   1, get2byte(&da
335d0 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20  ta[hdr+5]));.   
335e0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
335f0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
33600 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
33610 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
33620 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
33630 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
33640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
33650 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
33660 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
33670 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20  *2]);.      u16 
33680 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
33690 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
336a0 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pc]);.      int 
336b0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63  j;.      if( (pc
336c0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
336d0 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
336e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
336f0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
33700 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
33710 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
33720 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
33730 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
33740 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
33750 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
33760 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
33770 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
33780 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
33790 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
337a0 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
337b0 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
337c0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
337d0 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
337e0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
337f0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
33800 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
33810 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
33820 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
33830 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
33840 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
33850 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33860 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
33870 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
33880 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
33890 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
338a0 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
338b0 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
338c0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
338d0 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
338e0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
338f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33900 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
33910 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
33920 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
33930 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
33940 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
33950 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
33960 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
33970 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
33980 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
33990 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
339a0 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
339b0 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
339c0 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
339d0 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
339e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
339f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33a00 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
33a10 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
33a20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
33a30 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
33a40 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
33a50 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
33a60 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
33a70 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
33a80 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
33a90 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
33aa0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
33ab0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
33ac0 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  hit);..  release
33ad0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
33ae0 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d  eturn depth+1;.}
33af0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33b00 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33b10 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
33b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
33b30 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
33b40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
33b50 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
33b60 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
33b70 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
33b80 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
33b90 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
33ba0 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
33bb0 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
33bc0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
33bd0 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
33be0 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
33bf0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
33c00 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
33c10 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68  If everything ch
33c20 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72  ecks out, this r
33c30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
33c40 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69  ULL.  If somethi
33c50 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20  ng is.** amiss, 
33c60 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
33c70 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
33c80 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
33c90 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a   from malloc().*
33ca0 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  * and a pointer 
33cb0 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65  to that error me
33cc0 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65  ssage is returne
33cd0 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  d.  The calling 
33ce0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
33cf0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
33d00 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72  reeing the error
33d10 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74   message when it
33d20 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61   is done..*/.cha
33d30 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49  r *sqlite3BtreeI
33d40 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20  ntegrityCheck(. 
33d50 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f   Btree *p,     /
33d60 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62  * The btree to b
33d70 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
33d80 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20  nt *aRoot,   /* 
33d90 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74  An array of root
33da0 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66   pages numbers f
33db0 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72  or individual tr
33dc0 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ees */.  int nRo
33dd0 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ot,    /* Number
33de0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
33df0 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Root[] */.  int 
33e00 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f  mxErr,    /* Sto
33e10 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f  p reporting erro
33e20 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61  rs after this ma
33e30 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ny */.  int *pnE
33e40 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e  rr    /* Write n
33e50 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
33e60 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72  seen to this var
33e70 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  iable */.){.  in
33e80 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b  t i;.  int nRef;
33e90 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73  .  IntegrityCk s
33ea0 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65  Check;.  BtShare
33eb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
33ec0 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30  .  char zErr[100
33ed0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ];..  sqlite3Btr
33ee0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
33ef0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
33f00 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
33f10 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
33f20 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
33f30 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
33f40 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f  try(p)!=SQLITE_O
33f50 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
33f60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33f70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
33f80 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20  3StrDup("Unable 
33f90 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  to acquire a rea
33fa0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
33fb0 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20  tabase");.  }.  
33fc0 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74  sCheck.pBt = pBt
33fd0 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65  ;.  sCheck.pPage
33fe0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
33ff0 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  .  sCheck.nPage 
34000 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
34010 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b  (sCheck.pPager);
34020 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20  .  sCheck.mxErr 
34030 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63  = mxErr;.  sChec
34040 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70  k.nErr = 0;.  *p
34050 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65  nErr = 0;.#ifnde
34060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34070 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
34080 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b  Bt->nTrunc!=0 ){
34090 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  .    sCheck.nPag
340a0 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  e = pBt->nTrunc;
340b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
340c0 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d  ( sCheck.nPage==
340d0 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  0 ){.    unlockB
340e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
340f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
34100 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
34110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
34120 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20   sCheck.anRef = 
34130 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28  sqlite3Malloc( (
34140 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
34150 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
34160 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  Ref[0]) );.  if(
34170 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29   !sCheck.anRef )
34180 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
34190 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
341a0 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a      *pnErr = 1;.
341b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
341c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
341d0 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69  turn sqlite3MPri
341e0 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e 61 62  ntf(p->db, "Unab
341f0 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20  le to malloc %d 
34200 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20  bytes", .       
34210 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
34220 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
34230 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a  anRef[0]));.  }.
34240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43    for(i=0; i<=sC
34250 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  heck.nPage; i++)
34260 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  { sCheck.anRef[i
34270 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50  ] = 0; }.  i = P
34280 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34290 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d  (pBt);.  if( i<=
342a0 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a  sCheck.nPage ){.
342b0 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66      sCheck.anRef
342c0 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  [i] = 1;.  }.  s
342d0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
342e0 69 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73  it(&sCheck.errMs
342f0 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28  g, zErr, sizeof(
34300 7a 45 72 72 29 2c 20 32 30 30 30 30 29 3b 0a 0a  zErr), 20000);..
34310 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69    /* Check the i
34320 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
34330 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20  freelist.  */.  
34340 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63  checkList(&sChec
34350 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26  k, 1, get4byte(&
34360 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
34370 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20  ta[32]),.       
34380 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
34390 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
343a0 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72  a[36]), "Main fr
343b0 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f  eelist: ");..  /
343c0 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20  * Check all the 
343d0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
343e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20  or(i=0; i<nRoot 
343f0 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
34400 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
34410 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Root[i]==0 ) con
34420 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
34430 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34440 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
34450 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
34460 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20   aRoot[i]>1 ){. 
34470 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
34480 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
34490 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  i], PTRMAP_ROOTP
344a0 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AGE, 0, 0);.    
344b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
344c0 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65  ckTreePage(&sChe
344d0 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c  ck, aRoot[i], 0,
344e0 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72   "List of tree r
344f0 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20  oots: ");.  }.. 
34500 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
34510 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
34520 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63  file is referenc
34530 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ed.  */.  for(i=
34540 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  1; i<=sCheck.nPa
34550 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ge && sCheck.mxE
34560 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66  rr; i++){.#ifdef
34570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34580 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
34590 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
345a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  =0 ){.      chec
345b0 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
345c0 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
345d0 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
345e0 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  i);.    }.#else.
345f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
34600 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
34610 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b  auto-vacuum, mak
34620 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73  e sure no tables
34630 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
34640 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f  references to po
34650 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
34660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34670 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
34680 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
34690 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
346a0 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d  , i)!=i || !pBt-
346b0 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
346c0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
346d0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
346e0 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
346f0 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
34700 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65    }.    if( sChe
34710 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26  ck.anRef[i]!=0 &
34720 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
34730 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
34740 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f  ==i && pBt->auto
34750 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
34760 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
34770 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69  &sCheck, 0, "Poi
34780 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64  nter map page %d
34790 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c   is referenced",
347a0 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
347b0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  f.  }..  /* Make
347c0 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79   sure this analy
347d0 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76  sis did not leav
347e0 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61  e any unref() pa
347f0 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63  ges.  */.  unloc
34800 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
34810 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20  Bt);.  if( nRef 
34820 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  != sqlite3PagerR
34830 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
34840 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
34850 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
34860 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
34870 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
34880 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
34890 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
348a0 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
348b0 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69        nRef, sqli
348c0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
348d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20  (pBt->pPager).  
348e0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43    );.  }..  /* C
348f0 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70  lean  up and rep
34900 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  ort errors..  */
34910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
34920 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  eave(p);.  sqlit
34930 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61  e3_free(sCheck.a
34940 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20  nRef);.  *pnErr 
34950 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20  = sCheck.nErr;. 
34960 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72   if( sCheck.nErr
34970 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74 72  ==0 ) sqlite3Str
34980 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65  AccumReset(&sChe
34990 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65  ck.errMsg);.  re
349a0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
349b0 63 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65  ccumFinish(&sChe
349c0 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65  ck.errMsg);.}.#e
349d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
349e0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
349f0 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ECK */../*.** Re
34a00 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
34a10 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e  thname of the un
34a20 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
34a30 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
34a40 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65  e pager filename
34a50 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73   is invariant as
34a60 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67   long as the pag
34a70 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f  er is.** open so
34a80 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61   it is safe to a
34a90 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68  ccess without th
34aa0 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78  e BtShared mutex
34ab0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
34ac0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
34ad0 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a  Filename(Btree *
34ae0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
34af0 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
34b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
34b10 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
34b20 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
34b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34b40 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
34b50 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
34b60 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
34b70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
34b90 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20   directory name 
34ba0 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
34bb0 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
34bc0 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
34bd0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
34be0 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
34bf0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
34c00 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
34c10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
34c20 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  irname(Btree *p)
34c30 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
34c40 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
34c50 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
34c60 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d  3PagerDirname(p-
34c70 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
34c80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
34c90 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
34ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34cb0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
34cc0 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  e. The return.**
34cd0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72   value of this r
34ce0 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61  outine is the sa
34cf0 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  me regardless of
34d00 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75   whether the jou
34d10 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73  rnal file.** has
34d20 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72   been created or
34d30 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   not..**.** The 
34d40 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  pager journal fi
34d50 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  lename is invari
34d60 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
34d70 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
34d80 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
34d90 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
34da0 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
34db0 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
34dc0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
34dd0 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
34de0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
34df0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
34e00 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
34e10 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
34e20 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e  rJournalname(p->
34e30 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
34e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34e50 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
34e60 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c  * Copy the compl
34e70 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  ete content of p
34e80 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54  BtFrom into pBtT
34e90 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  o.  A transactio
34ea0 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74  n.** must be act
34eb0 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c  ive for both fil
34ec0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  es..**.** The si
34ed0 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d  ze of file pTo m
34ee0 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79  ay be reduced by
34ef0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
34f00 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
34f10 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20  goes wrong, the 
34f20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
34f30 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  To is rolled bac
34f40 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  k. .**.** If suc
34f50 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50  cessful, CommitP
34f60 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65  haseOne() may be
34f70 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62   called on pTo b
34f80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34f90 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20   .** The caller 
34fa0 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f  should finish co
34fb0 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61  mmitting the tra
34fc0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20  nsaction on pTo 
34fd0 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  by calling.** sq
34fe0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
34ff0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
35000 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28  t btreeCopyFile(
35010 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65  Btree *pTo, Btre
35020 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  e *pFrom){.  int
35030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35040 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67  .  Pgno i;..  Pg
35050 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20  no nFromPage;   
35060 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
35070 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f  ages in pFrom */
35080 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b  .  Pgno nToPage;
35090 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
350a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f   of pages in pTo
350b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50   */.  Pgno nNewP
350c0 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  age;      /* Num
350d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
350e0 70 54 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f  pTo after the co
350f0 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53  py */..  Pgno iS
35100 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  kip;         /* 
35110 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67  Pending byte pag
35120 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e  e in pTo */.  in
35130 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20  t nToPageSize;  
35140 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f    /* Page size o
35150 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a  f pTo in bytes *
35160 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67  /.  int nFromPag
35170 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20  eSize;  /* Page 
35180 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e  size of pFrom in
35190 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53   bytes */..  BtS
351a0 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70  hared *pBtTo = p
351b0 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61  To->pBt;.  BtSha
351c0 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70  red *pBtFrom = p
351d0 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74  From->pBt;.  pBt
351e0 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62  To->db = pTo->db
351f0 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20  ;.  pBtFrom->db 
35200 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20  = pFrom->db;..  
35210 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42  nToPageSize = pB
35220 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  tTo->pageSize;. 
35230 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d   nFromPageSize =
35240 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69   pBtFrom->pageSi
35250 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e  ze;..  if( pTo->
35260 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
35270 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69  RITE || pFrom->i
35280 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
35290 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
352a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
352b0 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d    }.  if( pBtTo-
352c0 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
352d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
352e0 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61  SY;.  }..  nToPa
352f0 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
35300 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  unt(pBtTo->pPage
35310 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20  r);.  nFromPage 
35320 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
35330 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
35340 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e  );.  iSkip = PEN
35350 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
35360 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  BtTo);..  /* Var
35370 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69  iable nNewPage i
35380 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
35390 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20 74  pages required t
353a0 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a  o store the.  **
353b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72   contents of pFr
353c0 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  om using the cur
353d0 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f  rent page-size o
353e0 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e  f pTo..  */.  nN
353f0 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e  ewPage = ((i64)n
35400 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29  FromPage * (i64)
35410 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20  nFromPageSize + 
35420 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
35430 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28   - 1) / .      (
35440 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b  i64)nToPageSize;
35450 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d  ..  for(i=1; rc=
35460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69  =SQLITE_OK && (i
35470 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d  <=nToPage || i<=
35480 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b  nNewPage); i++){
35490 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c  ..    /* Journal
354a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
354b0 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
354c0 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20 70  * iSkip is the p
354d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
354e0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28  e locking page (
354f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35500 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74  E).    ** in dat
35510 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f  abase *pTo (befo
35520 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68  re the copy). Th
35530 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72  is page is never
35540 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a   written .    **
35550 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
35560 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69  l file. Unless i
35570 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70  ==iSkip or the p
35580 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20  age was not.    
35590 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54  ** present in pT
355a0 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70  o before the cop
355b0 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75  y operation, jou
355c0 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d  rnal page i from
355d0 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   pTo..    */.   
355e0 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26   if( i!=iSkip &&
355f0 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20   i<=nToPage ){. 
35600 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
35610 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
35620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35630 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  rGet(pBtTo->pPag
35640 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29  er, i, &pDbPage)
35650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35680 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
35690 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
356a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
356b0 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29  && i>nFromPage )
356c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59  {.          /* Y
356d0 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77  eah.  It seems w
356e0 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e  ierd to call Don
356f0 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61  tWrite() right a
35700 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 42 75  fter Write(). Bu
35710 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  t.          ** t
35720 68 61 74 20 69 73 20 62 65 63 61 75 73 65 20 74  hat is because t
35730 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73  he names of thos
35740 65 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20  e procedures do 
35750 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20  not exactly .   
35760 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73         ** repres
35770 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f  ent what they do
35780 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c  .  Write() reall
35790 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69  y means "put thi
357a0 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20  s page in the.  
357b0 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62          ** rollb
357c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
357d0 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79  mark it as dirty
357e0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
357f0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
35800 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
35810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61  database file la
35820 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65  ter."  DontWrite
35830 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65  () undoes the se
35840 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20  cond part of.   
35850 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61         ** that a
35860 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  nd prevents the 
35870 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20  page from being 
35880 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
35890 61 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20  atabase. The.   
358a0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
358b0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72  s still on the r
358c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
358d0 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68   though.  And th
358e0 61 74 20 69 73 20 74 68 65 20 0a 20 20 20 20 20  at is the .     
358f0 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f       ** whole po
35900 69 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63  int of this bloc
35910 6b 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73 20  k: to put pages 
35920 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  on the rollback 
35930 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
35940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
35950 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
35960 74 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  tWrite(pDbPage);
35970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35980 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35990 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
359a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
359b0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 74    /* Overwrite t
359c0 68 65 20 64 61 74 61 20 69 6e 20 70 61 67 65 20  he data in page 
359d0 69 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20  i of the target 
359e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
359f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a00 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20 26 26  K && i!=iSkip &&
35a10 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29 7b 0a   i<=nNewPage ){.
35a20 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70  .      DbPage *p
35a30 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ToPage = 0;.    
35a40 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
35a50 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72 63 20  iOff;..      rc 
35a60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
35a70 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
35a80 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b 0a 20   i, &pToPage);. 
35a90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35ac0 67 65 72 57 72 69 74 65 28 70 54 6f 50 61 67 65  gerWrite(pToPage
35ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
35ae0 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 69    for(.        i
35af0 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50 61 67  Off=(i-1)*nToPag
35b00 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20  eSize; .        
35b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35b20 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67 65 53   iOff<i*nToPageS
35b30 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 69 4f  ize; .        iO
35b40 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
35b50 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ize.      ){.   
35b60 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 46 72       DbPage *pFr
35b70 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  omPage = 0;.    
35b80 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d      Pgno iFrom =
35b90 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65   (iOff/nFromPage
35ba0 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20 20 20  Size)+1;..      
35bb0 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e    if( iFrom==PEN
35bc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
35bd0 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20  BtFrom) ){.     
35be0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
35bf0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35c10 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e  gerGet(pBtFrom->
35c20 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26  pPager, iFrom, &
35c30 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
35c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35c60 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 73     char *zTo = s
35c70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
35c80 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  ta(pToPage);.   
35c90 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72         char *zFr
35ca0 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  om = sqlite3Page
35cb0 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61  rGetData(pFromPa
35cc0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
35cd0 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20 20 20  nt nCopy;..     
35ce0 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61       if( nFromPa
35cf0 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67 65 53  geSize>=nToPageS
35d00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
35d10 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28 69 2d     zFrom += ((i-
35d20 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  1)*nToPageSize -
35d30 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f   ((iFrom-1)*nFro
35d40 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  mPageSize));.   
35d50 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
35d60 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20   nToPageSize;.  
35d70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35d80 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 20 2b             zTo +
35d90 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46  = (((iFrom-1)*nF
35da0 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d 20 28  romPageSize) - (
35db0 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
35dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
35dd0 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61 67 65  Copy = nFromPage
35de0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
35df0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  }..          mem
35e00 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20  cpy(zTo, zFrom, 
35e10 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c 69 74  nCopy);..  sqlit
35e20 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46 72  e3PagerUnref(pFr
35e30 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
35e40 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
35e50 20 20 69 66 28 20 70 54 6f 50 61 67 65 20 29 20    if( pToPage ) 
35e60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35e70 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20  f(pToPage);.    
35e80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
35e90 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b 65  hings have worke
35ea0 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64 61  d so far, the da
35eb0 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
35ec0 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a  need to be .  **
35ed0 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
35ee0 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73 20  complex part is 
35ef0 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65 64  that it may need
35f00 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
35f10 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65 20   to.  ** a size 
35f20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 69  that is not an i
35f30 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
35f40 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  of nToPageSize -
35f50 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
35f60 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  * page size used
35f70 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 73   by the pager as
35f80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42 2d  sociated with B-
35f90 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20  Tree pTo..  **. 
35fa0 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c   ** For example,
35fb0 20 73 61 79 20 74 68 65 20 70 61 67 65 2d 73 69   say the page-si
35fc0 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30 34  ze of pTo is 204
35fd0 38 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  8 bytes and the 
35fe0 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e  original .  ** n
35ff0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
36000 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65 29  s 5 (10 KB file)
36010 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20 61  . If pFrom has a
36020 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31 30   page size of 10
36030 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20 61  24 .  ** bytes a
36040 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68 65 6e  nd 9 pages, then
36050 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20   the file needs 
36060 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  to be truncated 
36070 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69  to 9KB..  */.  i
36080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36090 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72 6f   ){.    if( nFro
360a0 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50 61  mPageSize!=nToPa
360b0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
360c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
360d0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
360e0 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70 50  erFile(pBtTo->pP
360f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36 34  ager);.      i64
36100 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e 46   iSize = (i64)nF
36110 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28 69  romPageSize * (i
36120 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20 20  64)nFromPage;.  
36130 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20 28      i64 iNow = (
36140 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e 4e  i64)((nToPage>nN
36150 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65 3a  ewPage)?nToPage:
36160 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36 34  nNewPage) * (i64
36170 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20  )nToPageSize; . 
36180 20 20 20 20 20 69 36 34 20 69 50 65 6e 64 69 6e       i64 iPendin
36190 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49 4e  g = ((i64)PENDIN
361a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
361b0 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f 50  o)-1) *(i64)nToP
361c0 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20 20  ageSize;.  .    
361d0 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3c    assert( iSize<
361e0 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20 20  =iNow );.  .    
361f0 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61 73    /* Commit phas
36200 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65 20  e one syncs the 
36210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73  journal file ass
36220 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 6f  ociated with pTo
36230 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61   .      ** conta
36240 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  ining the origin
36250 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65 73  al data. It does
36260 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64 61   not sync the da
36270 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
36280 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66 74    ** itself. Aft
36290 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69 74  er doing this it
362a0 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
362b0 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e 64  OsTruncate() and
362c0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
362d0 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68 65  file APIs on the
362e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
362f0 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  irectly..      *
36300 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 64  /.      pBtTo->d
36310 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 20  b = pTo->db;.   
36320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36330 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
36340 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  ne(pBtTo->pPager
36350 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  , 0, 0, 1);.    
36360 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f 77    if( iSize<iNow
36370 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
36380 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
36390 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
363a0 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a 65  ate(pFile, iSize
363b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
363c0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
363d0 74 68 61 74 20 63 6f 70 69 65 64 20 64 61 74 61  that copied data
363e0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70   from database p
363f0 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64 20  From to pTo did 
36400 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f 70  not.      ** pop
36410 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69 6e  ulate the lockin
36420 67 20 70 61 67 65 20 6f 66 20 64 61 74 61 62 61  g page of databa
36430 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20 70  se pTo. If the p
36440 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20 20  age-size of.    
36450 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73 6d    ** pFrom is sm
36460 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74 20  aller than that 
36470 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65 61  of pTo, this mea
36480 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69 6c  ns some data wil
36490 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68  l.      ** not h
364a0 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64 2e  ave been copied.
364b0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
364c0 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63   ** This block c
364d0 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73 69 6e  opies the missin
364e0 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61  g data from data
364f0 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54  base pFrom to pT
36500 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e  o .      ** usin
36510 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68 69  g file APIs. Thi
36520 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
36530 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  e at this point 
36540 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20 20  we know that.   
36550 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65     ** all of the
36560 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   original data f
36570 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65 6e  rom pTo has been
36580 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
36590 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
365a0 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  al file. At this
365b0 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
365c0 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61 6e  be safe to do an
365d0 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20 20  ything at.      
365e0 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64 61  ** all to the da
365f0 74 61 62 61 73 65 20 66 69 6c 65 20 65 78 63 65  tabase file exce
36600 70 74 20 74 72 75 6e 63 61 74 65 20 69 74 20 74  pt truncate it t
36610 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20 20  o zero bytes..  
36620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
36630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36640 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3c  & nFromPageSize<
36650 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20 69  nToPageSize && i
36660 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b 0a  Size>iPending){.
36670 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
36680 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a 20  ;.        for(. 
36690 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69 50           iOff=iP
366a0 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20 20  ending; .       
366b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
366c0 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64 69   && iOff<(iPendi
366d0 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b  ng+nToPageSize);
366e0 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66   .          iOff
366f0 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   += nFromPageSiz
36700 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  e.        ){.   
36710 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
36720 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  FromPage = 0;.  
36730 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
36740 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d  om = (iOff/nFrom
36750 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20 0a  PageSize)+1;.  .
36760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
36770 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rom==PENDING_BYT
36780 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20  E_PAGE(pBtFrom) 
36790 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61  || iFrom>nFromPa
367a0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
367b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
367c0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
367d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
367e0 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
367f0 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d  m->pPager, iFrom
36800 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  , &pFromPage);. 
36810 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
36820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36830 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
36840 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50  zFrom = sqlite3P
36850 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f  agerGetData(pFro
36860 6d 50 61 67 65 29 3b 0a 20 20 09 20 20 72 63 20  mPage);.  .  rc 
36870 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
36880 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e  (pFile, zFrom, n
36890 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20 69 4f  FromPageSize, iO
368a0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ff);.           
368b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
368c0 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ef(pFromPage);. 
368d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
368e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
368f0 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
36900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36910 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
36920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36940 65 33 50 61 67 65 72 53 79 6e 63 28 70 42 74 54  e3PagerSync(pBtT
36950 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  o->pPager);.    
36960 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36980 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
36990 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 4e  BtTo->pPager, nN
369a0 65 77 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ewPage);.    }. 
369b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
369c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42  E_OK ){.      pB
369d0 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  tTo->pageSizeFix
369e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ed = 0;.    }.  
369f0 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
36a00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
36a10 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20  ollback(pTo);.  
36a20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  }..  return rc; 
36a30 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
36a40 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72  treeCopyFile(Btr
36a50 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a  ee *pTo, Btree *
36a60 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63  pFrom){.  int rc
36a70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36a80 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73 71  Enter(pTo);.  sq
36a90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
36aa0 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62  pFrom);.  rc = b
36ab0 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 54 6f  treeCopyFile(pTo
36ac0 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69  , pFrom);.  sqli
36ad0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 46  te3BtreeLeave(pF
36ae0 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rom);.  sqlite3B
36af0 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a  treeLeave(pTo);.
36b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36b10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36b20 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a  _OMIT_VACUUM */.
36b30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
36b40 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e  n-zero if a tran
36b50 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
36b60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36b70 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
36b80 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36b90 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c  ert( p==0 || sql
36ba0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36bb0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
36bc0 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
36bd0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
36be0 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f  NS_WRITE));.}../
36bf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
36c00 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d  zero if a statem
36c10 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
36c20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
36c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
36c40 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  InStmt(Btree *p)
36c50 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
36c60 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
36c70 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72  ex(p) );.  retur
36c80 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e  n (p->pBt && p->
36c90 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a  pBt->inStmt);.}.
36ca0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
36cb0 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64  n-zero if a read
36cc0 20 28 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e   (or write) tran
36cd0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
36ce0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36cf0 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
36d00 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ans(Btree *p){. 
36d10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36d20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
36d30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
36d40 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
36d50 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
36d60 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
36d70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
36d80 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
36d90 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d  to a blob of mem
36da0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
36db0 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
36dc0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68  shared-btree. Th
36dd0 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
36de0 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20   by client code 
36df0 66 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a 20 70  for its own.** p
36e00 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61  urposes (for exa
36e10 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61  mple, to store a
36e20 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65   high-level sche
36e30 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ma associated wi
36e40 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65  th .** the share
36e50 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62 74  d-btree). The bt
36e60 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65  ree layer manage
36e70 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
36e80 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a  ting issues..**.
36e90 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
36ea0 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  e this is called
36eb0 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72   on a shared-btr
36ec0 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73  ee, nBytes bytes
36ed0 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72   of memory.** ar
36ee0 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72  e allocated, zer
36ef0 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65  oed, and returne
36f00 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
36f10 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65 71   For each subseq
36f20 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68  uent .** call th
36f30 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74  e nBytes paramet
36f40 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e  er is ignored an
36f50 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
36f60 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20  he same blob.** 
36f70 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e  of memory return
36f80 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ed. .**.** If th
36f90 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74  e nBytes paramet
36fa0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
36fb0 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 68  blob of memory h
36fc0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
36fd0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 20  ** allocated, a 
36fe0 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  null pointer is 
36ff0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
37000 20 62 6c 6f 62 20 68 61 73 20 61 6c 72 65 61 64   blob has alread
37010 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  y been.** alloca
37020 74 65 64 2c 20 69 74 20 69 73 20 72 65 74 75 72  ted, it is retur
37030 6e 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a  ned as normal..*
37040 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65  *.** Just before
37050 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
37060 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65  e is closed, the
37070 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64   function passed
37080 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65   as the .** xFre
37090 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20  e argument when 
370a0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
370b0 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69  ation was made i
370c0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65  s invoked on the
370d0 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c   .** blob of all
370e0 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54  ocated memory. T
370f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
37100 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c  uld not call sql
37110 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f  ite3_free().** o
37120 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68  n the memory, th
37130 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f  e btree layer do
37140 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  es that..*/.void
37150 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63   *sqlite3BtreeSc
37160 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69  hema(Btree *p, i
37170 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28  nt nBytes, void(
37180 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29  *xFree)(void *))
37190 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
371a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
371b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
371c0 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  p);.  if( !pBt->
371d0 70 53 63 68 65 6d 61 20 26 26 20 6e 42 79 74 65  pSchema && nByte
371e0 73 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  s ){.    pBt->pS
371f0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d  chema = sqlite3M
37200 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73  allocZero(nBytes
37210 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65  );.    pBt->xFre
37220 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b  eSchema = xFree;
37230 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
37240 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
37250 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65  eturn pBt->pSche
37260 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ma;.}../*.** Ret
37270 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74  urn true if anot
37280 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20  her user of the 
37290 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65  same shared btre
372a0 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  e as the argumen
372b0 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64  t.** handle hold
372c0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
372d0 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ock on the sqlit
372e0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
372f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37300 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28  reeSchemaLocked(
37310 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
37320 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
37330 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37340 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
37350 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37360 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
37370 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  = (queryTableLoc
37380 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
37390 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51  , READ_LOCK)!=SQ
373a0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
373b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
373c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
373d0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
373e0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
373f0 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  CHE./*.** Obtain
37400 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
37410 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
37420 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54  page is iTab.  T
37430 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20  he.** lock is a 
37440 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73  write lock if is
37450 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75  Writelock is tru
37460 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b  e or a read lock
37470 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c  .** if it is fal
37480 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
37490 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65  e3BtreeLockTable
374a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
374b0 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c  Tab, u8 isWriteL
374c0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
374d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
374e0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
374f0 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54 79 70 65  .    u8 lockType
37500 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b 20 69   = READ_LOCK + i
37510 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
37520 61 73 73 65 72 74 28 20 52 45 41 44 5f 4c 4f 43  assert( READ_LOC
37530 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  K+1==WRITE_LOCK 
37540 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
37550 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c  sWriteLock==0 ||
37560 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20   isWriteLock==1 
37570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
37580 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
37590 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
375a0 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f  Lock(p, iTab, lo
375b0 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 69 66 28  ckType);.    if(
375c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
375d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
375e0 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20  kTable(p, iTab, 
375f0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 7d  lockType);.    }
37600 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
37610 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
37620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
37630 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
37640 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
37650 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
37660 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
37670 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
37680 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
37690 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
376a0 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
376b0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
376c0 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
376d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
376e0 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
376f0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
37700 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
37710 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
37720 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
37730 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
37740 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
37750 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
37760 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
37770 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
37780 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
37790 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
377a0 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
377b0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
377c0 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28  d *z){.  assert(
377d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
377e0 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73  x(pCsr) );.  ass
377f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
37800 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42  ex_held(pCsr->pB
37810 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
37820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73   );.  assert(pCs
37830 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
37840 64 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f 72 65  dle);..  restore
37850 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
37860 43 73 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Csr);.  assert( 
37870 70 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCsr->eState!=CU
37880 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
37890 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e   );.  if( pCsr->
378a0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
378b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
378c0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
378d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
378e0 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69   some preconditi
378f0 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29  ons: .  **   (a)
37900 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
37910 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  pen for writing,
37920 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72  .  **   (b) ther
37930 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63  e is no read-loc
37940 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62  k on the table b
37950 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e  eing modified an
37960 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65  d.  **   (c) the
37970 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61   cursor points a
37980 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66  t a valid row of
37990 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
379a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43  ..  */.  if( !pC
379b0 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  sr->wrFlag ){.  
379c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
379d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
379e0 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70  assert( !pCsr->p
379f0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20  Bt->readOnly .  
37a00 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d          && pCsr-
37a10 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
37a20 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
37a30 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   );.  if( checkR
37a40 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70  eadLocks(pCsr->p
37a50 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e  Btree, pCsr->pgn
37a60 6f 52 6f 6f 74 2c 20 70 43 73 72 2c 20 30 29 20  oRoot, pCsr, 0) 
37a70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
37a80 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
37a90 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
37aa0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
37ab0 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
37ac0 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
37ad0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
37ae0 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61  ID || !pCsr->pPa
37af0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
37b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37b10 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
37b20 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
37b30 61 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c  ad(pCsr, offset,
37b40 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
37b50 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b  char *)z, 0, 1);
37b60 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61  .}../* .** Set a
37b70 20 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75   flag on this cu
37b80 72 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68  rsor to cache th
37b90 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70  e locations of p
37ba0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a  ages from the .*
37bb0 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  * overflow list 
37bc0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
37bd0 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 65  row. This is use
37be0 64 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65  d by cursors ope
37bf0 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65  ned.** for incre
37c00 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f  mental blob IO o
37c10 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nly..**.** This 
37c20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20  function sets a 
37c30 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61  flag only. The a
37c40 63 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74  ctual page locat
37c50 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74  ion cache.** (st
37c60 6f 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72  ored in BtCursor
37c70 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73  .aOverflow[]) is
37c80 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75   allocated and u
37c90 73 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a  sed by function.
37ca0 2a 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  ** accessPayload
37cb0 28 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66  () (the worker f
37cc0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69  unction for sqli
37cd0 74 65 33 42 74 72 65 65 44 61 74 61 28 29 20 61  te3BtreeData() a
37ce0 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  nd.** sqlite3Btr
37cf0 65 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f  eePutData())..*/
37d00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
37d10 65 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28  eeCacheOverflow(
37d20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
37d30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
37d40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
37d50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
37d60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37d70 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
37d80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
37d90 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73  assert(!pCur->is
37da0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
37db0 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
37dc0 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
37dd0 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
37de0 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e  andle = 1;.}.#en
37df0 64 69 66 0a                                      dif.