/ Hex Artifact Content
Login

Artifact 89f1122f865f44a26ed65e59c998969bcb12b9c8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 37 37 20 32 30 30 38 2f 30  c,v 1.477 2008/0
0190: 37 2f 31 31 20 30 33 3a 33 34 3a 31 30 20 64 72  7/11 03:34:10 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 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2890: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
28a0: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
28b0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
28c0: 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ion()..**.** If 
28d0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
28e0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64  ent argument - d
28f0: 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65  oSeek - is false
2900: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
2910: 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  f .** returning 
2920: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
2930: 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  s saved position
2940: 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73 69  , any saved posi
2950: 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a  tion is deleted.
2960: 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ** and the curso
2970: 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20 43  r state set to C
2980: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a  URSOR_INVALID..*
2990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
29a0: 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  eeRestoreOrClear
29b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
29c0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
29e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2a00: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a10: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
2a20: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
2a30: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a40: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2a50: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2a60: 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75  >skip;.  }.  pCu
2a70: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a80: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
2a90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2aa0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
2ab0: 2d 3e 70 4b 65 79 2c 20 30 2c 20 70 43 75 72 2d  ->pKey, 0, pCur-
2ac0: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
2ad0: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
2ae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2af0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b00: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
2b10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
2b20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b30: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b40: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2b50: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b60: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
2b70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2b80: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72  define restoreOr
2b90: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2ba0: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
2bb0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
2bc0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
2bd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
2be0: 72 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61  reeRestoreOrClea
2bf0: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2c00: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
2c10: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e  SQLITE_OK)..#ifn
2c20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c30: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2c40: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
2c50: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
2c60: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
2c70: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
2c80: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2c90: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
2ca0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2cb0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
2cc0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
2cd0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
2ce0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
2cf0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
2d00: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
2d10: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
2d20: 4d 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70  MapPage, iPtrMap
2d30: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
2d40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2d60: 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  );.  nPagesPerMa
2d70: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
2d80: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
2d90: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
2da0: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
2db0: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
2dc0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
2dd0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
2de0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
2df0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2e00: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
2e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
2e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2e30: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
2e40: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
2e50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e60: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
2e70: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
2e80: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
2e90: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
2ea0: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
2eb0: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
2ec0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
2ed0: 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72  'pgno'..** An er
2ee0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ef0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
2f00: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
2f10: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
2f20: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2f30: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
2f40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
2f50: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
2f60: 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62  no parent){.  Db
2f70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
2f80: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
2f90: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
2fa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
2fb0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2fc0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
2fd0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
2fe0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2ff0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
3000: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3010: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
3020: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
3030: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  e */.  int rc;..
3040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
3070: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
3080: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
3090: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
30a0: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
30b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
30c0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
30d0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
30e0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30f0: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
3100: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
3110: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
3120: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3130: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
3140: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  KPT;.  }.  iPtrm
3150: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
3160: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
3170: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3180: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
3190: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
31a0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
31b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
31d0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
31e0: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
31f0: 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70   key);.  pPtrmap
3200: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
3210: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
3220: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
3230: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
3240: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
3250: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3260: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
3270: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
3280: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
3290: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
32a0: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
32b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32c0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
32d0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
32e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32f0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
3300: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
3310: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
3320: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
3330: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
3340: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61    }..  sqlite3Pa
3350: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
3360: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3370: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
3380: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
3390: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
33a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33b0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
33c0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
33d0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
33e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
33f0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
3400: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
3410: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
3420: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
3430: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
3440: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
3450: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3460: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
3470: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
3480: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
3490: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
34a0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
34b0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
34c0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
34d0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
34e0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
34f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
3500: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
3510: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
3520: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
3530: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
3540: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3550: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
3560: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
3570: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
3580: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
3590: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
35a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35b0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
35c0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
35d0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
35e0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
35f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
3600: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
3610: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
3620: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
3630: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3640: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
3650: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
3660: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
3670: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
3680: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
3690: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
36a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
36b0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
36c0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
36d0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
36e0: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
36f0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3700: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
3710: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
3720: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
3730: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
3740: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
3750: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
3760: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
3770: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
3780: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3790: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a  _AUTOVACUUM */..
37a0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
37b0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
37c0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
37d0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
37e0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
37f0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
3800: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
3810: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
3820: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3830: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
3840: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3850: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
3860: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
3870: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
3880: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
3890: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
38a0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 20  l(pPage, iCell) 
38b0: 5c 0a 20 20 28 28 70 50 61 67 65 29 2d 3e 61 44  \.  ((pPage)->aD
38c0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
38d0: 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 5b 28  (pPage)->aData[(
38e0: 70 50 61 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73  pPage)->cellOffs
38f0: 65 74 2b 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a  et+2*(iCell)])).
3900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
3910: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
3920: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
3930: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
3940: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
3950: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3960: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
3970: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
3980: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
3990: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
39a0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
39b0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
39c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
39d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
39e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
39f0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
3a00: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
3a10: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
3a20: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
3a30: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
3a40: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
3a50: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
3a60: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
3a70: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
3a80: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
3a90: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
3aa0: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
3ab0: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
3ac0: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
3ad0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
3ae0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
3af0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
3b00: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
3b10: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
3b20: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
3b30: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
3b40: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
3b50: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
3b60: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
3b70: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3b80: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
3b90: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
3ba0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3bb0: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
3bc0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3bd0: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
3be0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
3bf0: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
3c00: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
3c10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
3c20: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
3c30: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
3c40: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
3c50: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
3c60: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3c70: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
3c80: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
3c90: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
3ca0: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
3cb0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3cc0: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
3cd0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
3ce0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
3cf0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
3d00: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3d20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
3d30: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
3d40: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
3d50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
3d60: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3d70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
3da0: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
3db0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
3dc0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
3dd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3de0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
3df0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
3e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3e10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
3e20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3e30: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
3e40: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
3e50: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
3e60: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
3e70: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
3e80: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
3e90: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
3ea0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
3eb0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
3ec0: 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Data ){.    n +=
3ed0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
3ee0: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
3ef0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3f00: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
3f10: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
3f20: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
3f30: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
3f40: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
3f50: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
3f60: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
3f70: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
3f80: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
3f90: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
3fa0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 78 29 3b 0a  (&pCell[n], x);.
3fb0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3fc0: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3fd0: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3fe0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3ff0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
4000: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
4010: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
4020: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
4030: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
4040: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
4050: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
4060: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
4070: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
4080: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
4090: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
40a0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
40b0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
40d0: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
40e0: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
40f0: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
4100: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
4110: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
4120: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
4130: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
4140: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
4150: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
4160: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
4170: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4180: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4190: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
41a0: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
41b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
41c0: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
41d0: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
41e0: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
41f0: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4200: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4210: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
4220: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
4230: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
4240: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
4250: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
4260: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
4270: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4280: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4290: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
42a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
42b0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
42c0: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
42d0: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
42e0: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
42f0: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4300: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4310: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
4320: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
4330: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
4340: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
4350: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
4360: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
4370: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4380: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4390: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
43a0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
43b0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
43c0: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
43d0: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
43e0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
43f0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4400: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4410: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
4420: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
4430: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
4440: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
4450: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
4460: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
4470: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4480: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4490: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
44a0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
44b0: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
44c0: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
44d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
44e0: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
44f0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4500: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4510: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
4520: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4530: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
4540: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
4550: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
4560: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
4570: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4580: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4590: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
45a0: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
45b0: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
45c0: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
45d0: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
45e0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
45f0: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4600: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4610: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
4620: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4630: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
4640: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
4650: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
4660: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
4670: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4690: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
46a0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
46b0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
46c0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
46d0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
46e0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
46f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4700: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4710: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
4720: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
4730: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
4740: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
4750: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
4760: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
4770: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4780: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4790: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
47a0: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
47b0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
47c0: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
47d0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
47e0: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
47f0: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4800: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4810: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
4820: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
4830: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4840: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
4850: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4860: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4870: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4880: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4890: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
48a0: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36  endif.static u16
48b0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
48c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
48d0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
48e0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
48f0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4900: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4910: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
4920: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
4930: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4940: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
4950: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
4960: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
4970: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4980: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4990: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
49a0: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
49b0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
49c0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
49d0: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
49e0: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
49f0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4a00: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4a10: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4a20: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
4a30: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
4a40: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ell!=0 );.  sqli
4a50: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4a60: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4a70: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
4a80: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
4a90: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4aa0: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
4ab0: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
4ac0: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
4ad0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4ae0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
4af0: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
4b00: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4b10: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4b20: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4b30: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
4b40: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
4b50: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
4b60: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
4b70: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
4b80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4b90: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
4ba0: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
4bb0: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
4bc0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
4bd0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
4be0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
4bf0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
4c00: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
4c10: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
4c20: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
4c30: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
4c40: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
4c50: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
4c60: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
4c70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4c80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
4c90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
4ca0: 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   );.  pCell = fi
4cb0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
4cc0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
4cd0: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
4ce0: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
4cf0: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
4d00: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
4d10: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
4d20: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
4d30: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
4d40: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
4d50: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
4d60: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
4d70: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
4d80: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
4d90: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
4da0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
4db0: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
4dc0: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
4dd0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
4de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4df0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
4e00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
4e10: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e30: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
4e40: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
4e70: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
4e80: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
4e90: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
4ea0: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
4eb0: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
4ec0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
4ed0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
4ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
4ef0: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
4f00: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
4f10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4f20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
4f30: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
4f40: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
4f50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4f60: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
4f70: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
4f80: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
4f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4fa0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
4fb0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
4fc0: 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20  /.  int brk;    
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fe0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
4ff0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5000: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
5010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5020: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5030: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
5040: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
5050: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
5060: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
5070: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
5080: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
5090: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
50a0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
50b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
50c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
50d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
50e0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
50f0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
5100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5110: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5120: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
5130: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
5140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5150: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
5160: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5170: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5180: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5190: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
51a0: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
51b0: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
51c0: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
51d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
51e0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
51f0: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
5200: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5210: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
5220: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
5230: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
5240: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
5250: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
5260: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
5270: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
5280: 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74  ize;.  brk = get
5290: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
52a0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
52b0: 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b  emp[brk], &data[
52c0: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
52d0: 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d   - brk);.  brk =
52e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66   usableSize;.  f
52f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
5300: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
5310: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
5320: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
5330: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
5340: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
5350: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
5360: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
5370: 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
5380: 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e   pc<pPage->pBt->
5390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
53a0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
53b0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
53c0: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20  p[pc]);.    brk 
53d0: 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  -= size;.    mem
53e0: 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20  cpy(&data[brk], 
53f0: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
5400: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
5410: 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a  Addr, brk);.  }.
5420: 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e 3d 63    assert( brk>=c
5430: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
5440: 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l );.  put2byte(
5450: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72  &data[hdr+5], br
5460: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
5470: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
5480: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
5490: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61  [hdr+7] = 0;.  a
54a0: 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ddr = cellOffset
54b0: 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73  +2*nCell;.  mems
54c0: 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  et(&data[addr], 
54d0: 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a 7d 0a  0, brk-addr);.}.
54e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
54f0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
5500: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
5510: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5520: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
5530: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
5540: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
5550: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
5560: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
5570: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
5580: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
5590: 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68  gh.** space.  Th
55a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
55b0: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
55c0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
55d0: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
55e0: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
55f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5600: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
5610: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
5620: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
5630: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
5640: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
5650: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
5660: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
5670: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
5680: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
5690: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
56a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56b0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
56c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
56d0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
56e0: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
56f0: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
5700: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
5710: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
5720: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
5730: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
5740: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
5750: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5760: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
5770: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5780: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5790: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
57a0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
57b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
57c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
57d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
57e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
57f0: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
5800: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
5810: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
5820: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
5830: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
5840: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
5850: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  low==0 );.  pPag
5860: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
5870: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5880: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5890: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
58a0: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
58b0: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
58c0: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
58d0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
58e0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
58f0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
5900: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
5910: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
5920: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
5930: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
5940: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5950: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5960: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5970: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5980: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5990: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
59a0: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
59b0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
59c0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
59d0: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
59e0: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
59f0: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
5a00: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5a10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
5a20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5a30: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
5a40: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
5a50: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
5a60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5a70: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5a80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5a90: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
5aa0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
5ab0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
5ac0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
5ad0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
5ae0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
5af0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
5b00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
5b10: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
5b20: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5b30: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
5b40: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5b50: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
5b60: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5b70: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
5b80: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
5b90: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
5ba0: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
5bb0: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
5bc0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
5bd0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5be0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5bf0: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5c00: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5c10: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5c20: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5c30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5c40: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5c50: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5c70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5c80: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5c90: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5ca0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5cb0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5cc0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5cd0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5ce0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5cf0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5d00: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5d10: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5d20: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5d30: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5d40: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5d50: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5d60: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5d70: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d80: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5d90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5da0: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5db0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5dc0: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5dd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5de0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5df0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5e00: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5e10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5e20: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5e30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5e40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5e50: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5e60: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5e70: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5e80: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5e90: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5ea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5eb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5ec0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5ed0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5ee0: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5ef0: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5f00: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5f10: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5f20: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5f30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5f40: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5f50: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5f60: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5f70: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
5f80: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
5f90: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
5fa0: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
5fb0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
5fc0: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
5fd0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
5fe0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
5ff0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
6000: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
6010: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
6020: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
6030: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
6040: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
6050: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
6060: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6070: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6080: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6090: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
60a0: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
60b0: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
60c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
60e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
60f0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
6100: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
6110: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6120: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
6130: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6140: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
6150: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6160: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
6170: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6180: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6190: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
61a0: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
61b0: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
61c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
61d0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
61e0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
61f0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
6200: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
6210: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
6220: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
6230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6240: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6250: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6260: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
6270: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6280: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6290: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
62a0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
62b0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
62c0: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
62d0: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
62e0: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
62f0: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
6300: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
6310: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
6320: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6330: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
6340: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6350: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
6360: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
6370: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6380: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6390: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
63a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
63b0: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
63c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
63d0: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
63e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
63f0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6410: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
6420: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
6430: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
6440: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
6450: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
6460: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
6470: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6480: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6490: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
64a0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
64b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
64c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
64d0: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
64e0: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
64f0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
6500: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6510: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
6520: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
6530: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6540: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
6550: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
6560: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
6570: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6580: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6590: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
65a0: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
65b0: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
65c0: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
65d0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
65e0: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
65f0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
6600: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
6610: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
6620: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
6630: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
6640: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
6650: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
6660: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
6670: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6680: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6690: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
66a0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
66b0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
66c0: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
66d0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
66e0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
66f0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
6700: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
6710: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
6720: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
6730: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6740: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
6750: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
6760: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
6770: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6780: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6790: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
67a0: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
67b0: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
67c0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
67d0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
67e0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
67f0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6800: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
6810: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
6820: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
6830: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6840: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
6850: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
6860: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
6870: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6880: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6890: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
68a0: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
68b0: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
68c0: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
68d0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
68e0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
68f0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
6900: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
6910: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
6920: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
6930: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
6940: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
6950: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
6960: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
6970: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6980: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6990: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
69a0: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
69b0: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
69c0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
69d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
69e0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
69f0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
6a00: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
6a10: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
6a20: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6a30: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6a40: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6a50: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6a60: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6a70: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6a80: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6a90: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6aa0: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6ab0: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6ac0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6ad0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6ae0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6af0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6b00: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6b20: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6b30: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6b40: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6b50: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6b60: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6b70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6b90: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6ba0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6bb0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6bc0: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6bd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6be0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6bf0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6c00: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6c10: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6c20: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6c30: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6c40: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6c50: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6c60: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6c70: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6c80: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6c90: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6ca0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6cb0: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6cc0: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6cd0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6ce0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6cf0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6d00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d10: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6d20: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6d30: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6d40: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6d50: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6d60: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 38 20  nt area */.  u8 
6d70: 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  *pOff;          
6d80: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
6d90: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
6da0: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
6db0: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20  n range */.  u8 
6dc0: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
6dd0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
6de0: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
6df0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 6d   array */.  u8 m
6e00: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ask;           /
6e10: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
6e20: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
6e30: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
6e40: 6f 66 66 73 65 74 73 20 2a 2f 0a 0a 20 20 70 42  offsets */..  pB
6e50: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6e60: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6e80: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6e90: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6ea0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6eb0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6ec0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6ed0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6ee0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6ef0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6f00: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f10: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
6f20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6f30: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
6f40: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6f50: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
6f60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6f70: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
6f80: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
6f90: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
6fa0: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
6fb0: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
6fc0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
6fd0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6fe0: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
6ff0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
7000: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
7010: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
7020: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7030: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7040: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
7050: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
7060: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
7070: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
7080: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
7090: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
70a0: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
70b0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
70c0: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
70d0: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
70e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
70f0: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
7100: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
7110: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7120: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
7130: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
7140: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
7150: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
7160: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
7170: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
7180: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7190: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
71a0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
71b0: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
71c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
71d0: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
71e0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
71f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
7200: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
7210: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
7220: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
7230: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
7240: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
7250: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
7260: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
7270: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7280: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
7290: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
72a0: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
72b0: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
72c0: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
72d0: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
72e0: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
72f0: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
7300: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
7310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7320: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7330: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
7340: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
7350: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
7360: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
7370: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7380: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
7390: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
73a0: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
73b0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
73c0: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
73d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
73e0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
73f0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
7400: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7410: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
7420: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
7430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7440: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
7450: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
7460: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
7470: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
7480: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7490: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
74a0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
74b0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
74c0: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
74d0: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
74e0: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
74f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7500: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7510: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
7520: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
7530: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
7540: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
7550: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
7560: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
7570: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7580: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7590: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
75a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
75b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
75c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
75d0: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66   that all the of
75e0: 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c  fsets in the cel
75f0: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l offset array a
7600: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
7610: 20 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20 7e 28 28   */.  mask = ~((
7620: 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
7630: 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 70 45  ze>>8))-1);.  pE
7640: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
7650: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
7660: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f 72 28 70  Cell*2];.  for(p
7670: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
7680: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
7690: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
76a0: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
76b0: 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64    if( pOff!=pEnd
76c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
76d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
76e0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  PT;.  }..  pPage
76f0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
7700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
7720: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
7730: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
7740: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
7750: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
7760: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
7770: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
7780: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7790: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
77a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
77b0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
77c0: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
77d0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
77e0: 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50  ;.  int hdr = pP
77f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7800: 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20    int first;..  
7810: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7820: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
7830: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
7840: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
7850: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7860: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
7870: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7880: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
7890: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
78a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
78b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
78c0: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
78d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
78e0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
78f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7900: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7910: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7920: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d  >mutex) );.  mem
7930: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
7940: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
7950: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
7960: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
7970: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
7980: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
7990: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
79a0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
79b0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
79c0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
79d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
79e0: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
79f0: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
7a00: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
7a10: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
7a20: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
7a30: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
7a40: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
7a50: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
7a60: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
7a70: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
7a80: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7a90: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
7aa0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
7ab0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
7ac0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
7ad0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
7ae0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
7af0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
7b00: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
7b10: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
7b20: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
7b30: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
7b40: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
7b50: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
7b60: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
7b70: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
7b80: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
7b90: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
7ba0: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
7bb0: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
7bc0: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
7bd0: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
7be0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
7bf0: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
7c00: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
7c10: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
7c20: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
7c30: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
7c40: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
7c50: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
7c60: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
7c70: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
7c80: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
7c90: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
7ca0: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
7cb0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
7cc0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a  e3BtreeGetPage(.
7cd0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
7ce0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
7cf0: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
7d00: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7d10: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7d20: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
7d30: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
7d40: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
7d50: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
7d60: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
7d70: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
7d80: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7d90: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
7da0: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
7db0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
7dc0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62  age *pPage;.  Db
7dd0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
7de0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7df0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7e00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
7e10: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
7e20: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
7e30: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
7e40: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
7e50: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
7e60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7e70: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
7e80: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
7e90: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
7ea0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
7eb0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
7ec0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7ed0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
7ee0: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
7ef0: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
7f00: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
7f10: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
7f20: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
7f30: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
7f40: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
7f50: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
7f60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7f70: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
7f80: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
7f90: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
7fa0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
7fb0: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
7fc0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
7fd0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
7fe0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
7ff0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8000: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
8010: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
8020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8030: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
8040: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
8050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8060: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8070: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
8080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8090: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
80a0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
80b0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
80c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
80d0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
80e0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
80f0: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
8100: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
8110: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
8120: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8130: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8140: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8150: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
8160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8170: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
8180: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
8190: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
81a0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
81b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
81c0: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
81d0: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
81e0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
81f0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
8200: 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  *ppPage, pParent
8210: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8220: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8230: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
8240: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
8250: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
8260: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
8280: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
8290: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
82a0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
82b0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
82c0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
82d0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
82e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
82f0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8300: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
8310: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8320: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
8330: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8340: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
8350: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8360: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
8370: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
8380: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
8390: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
83a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
83b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
83c0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
83d0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
83e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
83f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8400: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
8410: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
8420: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
8430: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8440: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
8450: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
8460: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
8470: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
8480: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
8490: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
84a0: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
84b0: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
84c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
84d0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
84e0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
84f0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
8500: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8510: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
8520: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
8530: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
8540: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8550: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
8560: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8570: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c  isInit==0 || 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 69 66 28 20 70 50 61 67  x) );.  if( pPag
85b0: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
85c0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
85d0: 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
85e0: 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ent;.    assert(
85f0: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
8600: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8610: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
8620: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
8630: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
8640: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
8650: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
8660: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
8670: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
8680: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
8690: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
86a0: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
86b0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
86c0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
86d0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
86e0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
86f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
8700: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
8710: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
8720: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
8730: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8740: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
8750: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
8760: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
8770: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
8780: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
8790: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
87a0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
87b0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
87c0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
87d0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
87e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
87f0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
8800: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
8810: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
8820: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8830: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
8840: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
8850: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
8860: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8870: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8880: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
8890: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
88a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
88b0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
88c0: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
88d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
88e0: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
88f0: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
8900: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
8910: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
8920: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
8930: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
8940: 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20   n){.  BtShared 
8950: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
8960: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
8970: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
8980: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8990: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
89a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
89b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
89c0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
89d0: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
89e0: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
89f0: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
8a00: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
8a10: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
8a20: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8a30: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
8a40: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
8a50: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
8a60: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
8a70: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
8a80: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
8a90: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
8aa0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
8ab0: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
8ac0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
8ad0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
8ae0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
8af0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
8b00: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8b10: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
8b20: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
8b30: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
8b40: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8b50: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8b60: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
8b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8b80: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
8b90: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
8ba0: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
8bb0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
8bc0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
8bd0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
8be0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
8bf0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
8c00: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
8c10: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
8c20: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
8c30: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
8c40: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
8c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
8c60: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
8c70: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
8c80: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
8c90: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
8ca0: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
8cb0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
8cc0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
8cd0: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75   /* The VFS to u
8ce0: 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65  se for this btre
8cf0: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
8d00: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pBt = 0;      /
8d10: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
8d20: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
8d30: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d50: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
8d60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
8d70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
8d80: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73   nReserve;.  uns
8d90: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
8da0: 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a  ader[100];..  /*
8db0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
8dc0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
8dd0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
8de0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
8df0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
8e00: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
8e10: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
8e20: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
8e30: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
8e40: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
8e50: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
8e60: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
8e70: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
8e80: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
8e90: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
8ea0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8eb0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
8ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8ed0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8ee0: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
8ef0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
8f00: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
8f10: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
8f20: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
8f30: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
8f40: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
8f50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
8f60: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
8f70: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
8f80: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
8f90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8fa0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
8fb0: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
8fc0: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
8fd0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
8fe0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
8ff0: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
9000: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9010: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
9020: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
9030: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
9040: 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e   db;..#if !defin
9050: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
9060: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
9070: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9080: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
9090: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
90a0: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
90b0: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
90c0: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
90d0: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
90e0: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
90f0: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
9100: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
9110: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
9120: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
9130: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
9140: 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  .   && (db->flag
9150: 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62 29  s & SQLITE_Vtab)
9160: 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e  ==0.   && zFilen
9170: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
9180: 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  [0].  ){.    if(
9190: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
91a0: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
91b0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
91c0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
91d0: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
91e0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
91f0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
9200: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
9210: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
9220: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
9230: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
9240: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
9250: 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20       if( db ){. 
9260: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
9270: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9280: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a  dCache;.      }.
9290: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
92a0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
92b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
92c0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
92d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
92e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92f0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
9300: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
9310: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
9320: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
9330: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
9340: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
9350: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
9360: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9370: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
9380: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9390: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
93a0: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73  .      for(pBt=s
93b0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
93c0: 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d  eList; pBt; pBt=
93d0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
93e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
93f0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9400: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
9410: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
9420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
9430: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
9440: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
9450: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
9460: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
9470: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
9480: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
9490: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
94a0: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
94b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
94c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
94d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
94e0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
94f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
9500: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
9510: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
9520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9530: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
9540: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
9550: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
9560: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
9570: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
9580: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
9590: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
95a0: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
95b0: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
95c0: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
95d0: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
95e0: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
95f0: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
9600: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
9610: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
9620: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
9630: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
9640: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
9650: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
9660: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
9670: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
9680: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9690: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
96a0: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
96b0: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
96c0: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
96d0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
96e0: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
96f0: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
9700: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
9710: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
9720: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
9730: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
9740: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
9750: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
9760: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
9770: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
9780: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9790: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
97a0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
97b0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
97c0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
97d0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
97e0: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
97f0: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
9800: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
9810: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
9820: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
9830: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
9840: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
9850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
9860: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9870: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9880: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9890: 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64  .    pBt->busyHd
98a0: 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  r.xFunc = sqlite
98b0: 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79  3BtreeInvokeBusy
98c0: 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74  Handler;.    pBt
98d0: 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d  ->busyHdr.pArg =
98e0: 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73   pBt;.    rc = s
98f0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
9900: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
9910: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
9940: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
9950: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
9960: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9970: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9980: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
9990: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
99a0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
99b0: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
99c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
99d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
99e0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
99f0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9a00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9a10: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
9a20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9a30: 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20  ->busyHdr);.    
9a40: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9a60: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70  rSetDestructor(p
9a70: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
9a80: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
9a90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
9aa0: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
9ab0: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
9ac0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
9ad0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
9ae0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
9af0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
9b00: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
9b10: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
9b20: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
9b30: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
9b40: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
9b50: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
9b60: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
9b70: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
9b80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9b90: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
9ba0: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
9bb0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
9bc0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
9bd0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
9be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
9bf0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9c00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9c10: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69  t->pageSize);.#i
9c20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9c30: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
9c40: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
9c50: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
9c60: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
9c70: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9c80: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
9c90: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
9ca0: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
9cb0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
9cc0: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
9cd0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
9ce0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9cf0: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
9d00: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
9d10: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
9d20: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9d30: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
9d40: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
9d50: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
9d60: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
9d70: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
9d80: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
9d90: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
9da0: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
9db0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9dc0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
9dd0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
9de0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
9df0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9e00: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
9e10: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
9e20: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
9e30: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
9e40: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
9e50: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
9e60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
9e70: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
9e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
9e90: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
9ea0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
9eb0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
9ec0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
9ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9ee0: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
9ef0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
9f00: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9f10: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
9f20: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
9f30: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
9f40: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
9f50: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
9f60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9f70: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
9f80: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
9f90: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
9fa0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
9fb0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
9fc0: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
9fd0: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
9fe0: 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Size */.    sqli
9ff0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a000: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
a010: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
a020: 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ;.   .#if !defin
a030: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a040: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
a050: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a060: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
a070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
a080: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
a090: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
a0a0: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
a0b0: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
a0c0: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
a0d0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a0e0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a0f0: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
a100: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
a110: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
a120: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a130: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a140: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
a150: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
a160: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
a170: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72  lite3Config.bCor
a180: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
a190: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
a1a0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a1b0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a1c0: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
a1d0: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
a1e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a1f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a200: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
a210: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
a220: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
a230: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a260: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
a270: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
a280: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
a290: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a2a0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
a2b0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
a2c0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
a2d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a2e0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a2f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a300: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a310: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a320: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a330: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a340: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a350: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a360: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a370: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a380: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a390: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a3a0: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a3b0: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a3c0: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a3d0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a3e0: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a3f0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a400: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a410: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a420: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a430: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a440: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a450: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a460: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
a470: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a480: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
a490: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
a4a0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
a4b0: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
a4c0: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
a4d0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
a4e0: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
a4f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a500: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
a510: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
a520: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
a530: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
a540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a550: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a560: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
a570: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
a580: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a590: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
a5a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a5b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
a5c0: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
a5d0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
a5e0: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
a5f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a600: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a610: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
a620: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
a630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a640: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
a650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a670: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a680: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
a690: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
a6a0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
a6b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a6c0: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
a6d0: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
a6e0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
a6f0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
a700: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a710: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
a720: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a730: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
a740: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a750: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
a760: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
a770: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a780: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
a790: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
a7a0: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
a7b0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
a7c0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
a7d0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
a7e0: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
a7f0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
a800: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
a810: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
a820: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
a830: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
a840: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
a850: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
a860: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
a870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a880: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a890: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a8a0: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
a8b0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
a8c0: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
a8d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a8e0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
a8f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a900: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a910: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a920: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a930: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
a940: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
a950: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
a960: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
a970: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
a980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61    if( sqlite3Sha
a990: 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d 70 42  redCacheList==pB
a9a0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a9b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a9c0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
a9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9e0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
a9f0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b  SharedCacheList;
aa00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c  .      while( pL
aa10: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  ist && pList->pN
aa20: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
aa30: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
aa40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
aa50: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
aa60: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
aa70: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
aa80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
aa90: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
aaa0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
aab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
aac0: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
aad0: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
aae0: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
aaf0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
ab00: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
ab10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
ab20: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
ab30: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
ab40: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
ab50: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
ab60: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
ab70: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
ab80: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
ab90: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
aba0: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
abb0: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
abc0: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
abd0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
abe0: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
abf0: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
ac00: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
ac10: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
ac20: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
ac30: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
ac40: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
ac50: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
ac60: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
ac70: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
ac80: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
ac90: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
aca0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
acb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
acc0: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
acd0: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
ace0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
acf0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ad00: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
ad10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ad20: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
ad30: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
ad40: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
ad50: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
ad60: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
ad70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ad80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
ad90: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
ada0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
adb0: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
adc0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72   = p->db;.  pCur
add0: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
ade0: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
adf0: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
ae00: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
ae10: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
ae20: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
ae30: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
ae40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ae50: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
ae60: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
ae70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
ae80: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
ae90: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
aea0: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
aeb0: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
aec0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
aed0: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
aee0: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
aef0: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
af00: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
af10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
af20: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
af30: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
af40: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
af50: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
af60: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
af70: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
af80: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
af90: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
afa0: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
afb0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
afc0: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
afd0: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
afe0: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
aff0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
b000: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
b010: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
b020: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
b030: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
b040: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
b050: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
b060: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
b070: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
b080: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
b090: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
b0a0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
b0b0: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
b0c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b0d0: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
b0e0: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
b0f0: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
b100: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
b110: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
b120: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
b130: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
b140: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
b150: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
b160: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
b170: 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
b180: 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
b190: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b1a0: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
b1b0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
b1c0: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
b1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b1e0: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
b1f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b200: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
b210: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
b220: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
b230: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
b240: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
b250: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
b260: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
b270: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
b280: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
b290: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
b2a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b2b0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
b2c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b2d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b2e0: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
b2f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b300: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
b310: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
b320: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b330: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
b340: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
b350: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
b360: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b370: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b380: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b390: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b3a0: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b3b0: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b3c0: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b3d0: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b3e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b3f0: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b400: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b410: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b420: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b430: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b440: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b450: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b460: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b470: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b480: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b490: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b4a0: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b4b0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b4c0: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b4d0: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b4e0: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b4f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b500: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b510: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b520: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b530: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b540: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b550: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b560: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b570: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b580: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b590: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b5a0: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b5b0: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b5c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b5d0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b5e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b5f0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
b600: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
b610: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b620: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
b630: 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
b640: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
b650: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b660: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b670: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b680: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b690: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b6a0: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b6b0: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b6c0: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b6d0: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b6e0: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b6f0: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b700: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b710: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b720: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b730: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b740: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b750: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b760: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b770: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b780: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b790: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b7a0: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b7b0: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b7c0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b7d0: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
b7e0: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
b7f0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b800: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
b810: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
b820: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
b830: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
b840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b850: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
b860: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b870: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
b880: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
b890: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
b8a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b8b0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
b8c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b8d0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
b8e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
b8f0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b900: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
b910: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
b920: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
b930: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
b940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b950: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b960: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
b970: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b980: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
b990: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
b9a0: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
b9b0: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
b9c0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
b9d0: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
b9e0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
b9f0: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
ba00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
ba10: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
ba20: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
ba30: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ba40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
ba50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ba60: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
ba70: 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
ba80: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
ba90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
baa0: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
bab0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bac0: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
bad0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
bae0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
baf0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bb00: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
bb10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
bb20: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
bb30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bb40: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
bb50: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
bb60: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
bb70: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
bb80: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
bb90: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
bba0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
bbb0: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
bbc0: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
bbd0: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
bbe0: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
bbf0: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
bc00: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
bc10: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
bc20: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
bc30: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
bc40: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
bc50: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
bc60: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
bc70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
bc80: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
bc90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
bca0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
bcb0: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
bcc0: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
bcd0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
bce0: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
bcf0: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
bd00: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
bd10: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bd20: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
bd30: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
bd40: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
bd50: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
bd60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
bd70: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
bd80: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
bd90: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
bda0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
bdb0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
bdc0: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
bdd0: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
bde0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bdf0: 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
be00: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
be10: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
be20: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
be30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
be40: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
be50: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
be60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
be70: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
be80: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
be90: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
bea0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
beb0: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bec0: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ze;.  }.  if( pa
bed0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bee0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
bef0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
bf00: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
bf10: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
bf20: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
bf30: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
bf40: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
bf50: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
bf60: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
bf70: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
bf80: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
bf90: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
bfa0: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
bfb0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
bfc0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
bfd0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
bfe0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
bff0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c000: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c010: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71  - nReserve;.  sq
c020: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c030: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c050: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
c060: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
c070: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c080: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
c090: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
c0a0: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
c0b0: 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Size;.}.int sqli
c0c0: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
c0d0: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
c0e0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c0f0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c100: 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
c110: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
c120: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
c130: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c140: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
c150: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c160: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
c170: 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
c180: 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
c190: 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
c1a0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
c1b0: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
c1c0: 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
c1d0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
c1e0: 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
c1f0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
c200: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
c210: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c220: 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
c230: 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
c240: 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
c250: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c260: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c270: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
c280: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
c290: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
c2a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c2b0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c2c0: 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
c2d0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c2e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
c2f0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
c300: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
c310: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
c320: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
c330: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
c340: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
c350: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
c360: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
c370: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
c380: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
c390: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
c3a0: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
c3b0: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
c3c0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
c3d0: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
c3e0: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
c3f0: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
c400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
c410: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
c420: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
c430: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
c440: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c450: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
c460: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
c470: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c480: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
c490: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
c4a0: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
c4b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
c4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c4d0: 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75  ;.  int av = (au
c4e0: 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a  toVacuum?1:0);..
c4f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c500: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c510: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c520: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
c530: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
c540: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
c550: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
c560: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c570: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
c580: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c590: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c5a0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c5b0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
c5c0: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
c5d0: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
c5e0: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
c5f0: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
c600: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
c610: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
c620: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
c630: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
c640: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
c650: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
c660: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
c670: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
c680: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
c690: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
c6a0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
c6b0: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
c6c0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
c6d0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
c6e0: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
c6f0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
c700: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
c710: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
c720: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
c730: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
c740: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
c760: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
c770: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
c780: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
c790: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
c7a0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
c7b0: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
c7c0: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
c7d0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c7e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
c7f0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
c800: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
c810: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
c820: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
c830: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c840: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
c850: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
c860: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
c870: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c880: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
c890: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
c8a0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
c8b0: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
c8c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
c8d0: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
c8e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c8f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
c900: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
c910: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c920: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c930: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c940: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c960: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c970: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
c980: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
c990: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c9a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c9b0: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
c9c0: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
c9d0: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
c9e0: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
c9f0: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
ca00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ca10: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
ca20: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
ca30: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
ca40: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
ca50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ca60: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
ca70: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
ca80: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
ca90: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
caa0: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
cab0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
cac0: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
cad0: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
cae0: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
caf0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
cb00: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
cb10: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
cb20: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cb30: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cb40: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
cb50: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
cb60: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
cb70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cb80: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
cb90: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
cba0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
cbb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
cbc0: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
cbd0: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
cbe0: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
cbf0: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
cc00: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
cc10: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
cc20: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
cc30: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
cc40: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
cc50: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
cc60: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
cc70: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
cc80: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
cc90: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
cca0: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
ccb0: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
ccc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
ccd0: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
cce0: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
ccf0: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
cd00: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
cd10: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
cd20: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
cd30: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
cd40: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
cd50: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
cd60: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
cd70: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
cd80: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
cd90: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
cda0: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
cdb0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
cdc0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
cdd0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
cde0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
cdf0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
ce00: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
ce10: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
ce20: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
ce30: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
ce40: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
ce50: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
ce60: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
ce70: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
ce80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
ce90: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
cea0: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
ceb0: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
cec0: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
ced0: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
cee0: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
cef0: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
cf00: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
cf10: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
cf20: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
cf30: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
cf40: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
cf50: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
cf60: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
cf70: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
cf80: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
cf90: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
cfa0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
cfb0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
cfc0: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
cfd0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
cfe0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
cff0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d000: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
d010: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
d020: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
d030: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
d040: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
d050: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
d060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d070: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
d080: 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
d090: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
d0a0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d0b0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d0c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d0d0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
d0e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
d0f0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
d100: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d110: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
d120: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
d130: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d140: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
d150: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
d160: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
d170: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d180: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
d190: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
d1a0: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
d1b0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
d1c0: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
d1d0: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
d1e0: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
d1f0: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
d200: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
d210: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
d220: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
d230: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
d240: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
d250: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
d260: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
d270: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
d280: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
d290: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
d2a0: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
d2b0: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
d2c0: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
d2d0: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
d2e0: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
d2f0: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
d300: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
d310: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d320: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
d330: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
d340: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
d350: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
d360: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
d370: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
d380: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
d390: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
d3a0: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
d3b0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
d3c0: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
d3d0: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
d3e0: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
d3f0: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d400: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
d410: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
d420: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
d430: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d440: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  32/255 - 23;.  p
d450: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
d460: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
d470: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
d480: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
d490: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
d4a0: 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74   - 23;.  if( pBt
d4b0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e  ->minLocal>pBt->
d4c0: 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d  maxLocal || pBt-
d4d0: 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20  >maxLocal<0 ){. 
d4e0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d4f0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20  it_failed;.  }. 
d500: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
d510: 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
d520: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
d530: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d540: 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
d550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
d560: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d570: 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
d580: 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
d590: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
d5a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d5b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d5c0: 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42  works like lockB
d5d0: 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68  tree() except th
d5e0: 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b  at it also invok
d5f0: 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63  es the.** busy c
d600: 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65  allback if there
d610: 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
d620: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d630: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  nt lockBtreeWith
d640: 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65  Retry(Btree *pRe
d650: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
d660: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
d670: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
d680: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66  eHoldsMutex(pRef
d690: 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d  ) );.  if( pRef-
d6a0: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
d6b0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69  NONE ){.    u8 i
d6c0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
d6d0: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
d6e0: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72  saction;.    btr
d6f0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
d700: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d710: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
d720: 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20  ns(pRef, 0);.   
d730: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
d740: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72  ansaction = inTr
d750: 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70  ansaction;.    p
d760: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54  Ref->inTrans = T
d770: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69  RANS_NONE;.    i
d780: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d790: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e   ){.      pRef->
d7a0: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
d7b0: 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  n--;.    }.    b
d7c0: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
d7d0: 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ef);.  }.  retur
d7e0: 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a  n rc;.}.       .
d7f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
d800: 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
d810: 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
d820: 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
d830: 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
d840: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
d850: 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
d860: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
d870: 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
d880: 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
d890: 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
d8a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d8b0: 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
d8c0: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
d8d0: 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
d8e0: 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
d8f0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
d900: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  y outstanding cu
d910: 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74  rsors, this rout
d920: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d930: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
d940: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
d950: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
d960: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
d970: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
d980: 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
d990: 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
d9a0: 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
d9b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d9c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d9d0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
d9e0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
d9f0: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
da00: 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ->pCursor==0 && 
da10: 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
da20: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
da30: 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
da40: 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29  Bt->pPager)>=1 )
da50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
da60: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
da70: 74 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  ta );.#if 0.    
da80: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
da90: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
daa0: 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
dab0: 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
dac0: 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
dad0: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
dae0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
daf0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
db00: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
db10: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
db20: 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
db30: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   1;.      }.#end
db40: 69 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  if.      release
db50: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
db60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
db70: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
db80: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
db90: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
dba0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
dbb0: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
dbc0: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
dbd0: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
dbe0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
dbf0: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
dc00: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dc10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
dc20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dc30: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
dc40: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
dc50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dc60: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
dc70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
dc80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
dc90: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
dca0: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
dcb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dcc0: 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
dcd0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dce0: 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
dcf0: 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
dd00: 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
dd10: 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
dd20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
dd30: 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
dd40: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
dd50: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dd60: 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
dd70: 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
dd80: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
dd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
dda0: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
ddb0: 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
ddc0: 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
ddd0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
dde0: 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
ddf0: 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
de00: 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
de10: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
de20: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
de30: 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
de40: 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
de50: 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
de60: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
de70: 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
de80: 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
de90: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
dea0: 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
deb0: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
dec0: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
ded0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dee0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
def0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
df00: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
df10: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
df20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
df30: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
df40: 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
df50: 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
df60: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
df70: 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
df80: 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
df90: 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
dfa0: 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
dfb0: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
dfc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dfd0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
dfe0: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
dff0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
e000: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
e010: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
e020: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e030: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
e040: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
e050: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
e060: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
e070: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
e080: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
e090: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
e0a0: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
e0b0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
e0c0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e0d0: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
e0e0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
e0f0: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
e100: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
e110: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
e120: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
e130: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
e140: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
e150: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
e160: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
e170: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
e180: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
e190: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
e1a0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
e1b0: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
e1c0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
e1d0: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
e1e0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e1f0: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
e200: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
e210: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
e220: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
e230: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
e240: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
e250: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e260: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
e270: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e280: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
e290: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e2a0: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
e2b0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e2c0: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
e2d0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e2e0: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e300: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
e310: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
e320: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
e330: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
e340: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
e350: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
e360: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
e370: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
e380: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
e390: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
e3a0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
e3b0: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e3c0: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
e3d0: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
e3e0: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
e3f0: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
e400: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
e410: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e420: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
e430: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e440: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
e450: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
e460: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
e470: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
e480: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
e490: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
e4a0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
e4b0: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
e4c0: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
e4d0: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
e4e0: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
e4f0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
e500: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
e510: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
e520: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
e530: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
e540: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
e550: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e560: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
e570: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
e580: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
e590: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
e5a0: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
e5b0: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
e5c0: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
e5d0: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
e5e0: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
e5f0: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
e600: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
e610: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
e620: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
e630: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
e640: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
e650: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
e660: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
e670: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
e680: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
e690: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
e6a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e6b0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
e6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
e6d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e6e0: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
e6f0: 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
e700: 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
e710: 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
e720: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
e730: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e740: 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
e750: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
e760: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
e770: 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
e780: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
e790: 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
e7a0: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
e7b0: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
e7c0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
e7d0: 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
e7e0: 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
e7f0: 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
e800: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e810: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
e820: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
e830: 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
e840: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
e850: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
e860: 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
e870: 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
e880: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e890: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e8a0: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e8b0: 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
e8c0: 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
e8d0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
e8e0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e8f0: 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
e900: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
e910: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
e920: 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
e930: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
e940: 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
e950: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
e960: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  */.  if( pBt->in
e970: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
e980: 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c  NS_WRITE && 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 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e9b0: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
e9c0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
e9d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e9e0: 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72  D_CACHE.  if( wr
e9f0: 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
ea00: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
ea10: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
ea20: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
ea30: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
ea40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ea50: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
ea60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ea70: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
ea80: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
ea90: 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gun;.      }.   
eaa0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
eab0: 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
eac0: 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
ead0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
eae0: 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
eaf0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68  (pBt);.      }wh
eb00: 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
eb10: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
eb20: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  E_OK );.    }.. 
eb30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
eb40: 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
eb50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
eb60: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
eb70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eb80: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
eb90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ebb0: 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
ebc0: 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
ebd0: 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
ebe0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ebf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
ec00: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
ec10: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
ec20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ec30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ec40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ec50: 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
ec60: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
ec70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
ec80: 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
ec90: 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
eca0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
ecb0: 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
ecc0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ecd0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
ece0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ecf0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ed00: 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b  ndler(pBt, 0) );
ed10: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
ed20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
ed30: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
ed40: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
ed50: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
ed60: 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
ed70: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
ed80: 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
ed90: 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
eda0: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
edb0: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
edc0: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
edd0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ede0: 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
edf0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ee00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ee10: 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
ee20: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61  lag>1 ){.      a
ee30: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78  ssert( !pBt->pEx
ee40: 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20  clusive );.     
ee50: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
ee60: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = p;.    }.#end
ee70: 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
ee80: 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74  egun:.  btreeInt
ee90: 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
eea0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
eeb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eec0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
eed0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
eee0: 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
eef0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
ef00: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
ef10: 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
ef20: 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
ef30: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
ef40: 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
ef50: 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
ef60: 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
ef70: 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
ef80: 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
ef90: 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
efa0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
efb0: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
efc0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
efd0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
f000: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
f010: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f040: 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
f050: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f080: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f090: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f0a0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
f0b0: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
f0c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
f0d0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
f0e0: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
f0f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f100: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f110: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
f120: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f130: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
f140: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
f150: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f160: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
f170: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f180: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
f190: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
f1a0: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
f1b0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f1c0: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
f1d0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
f1e0: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
f1f0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
f200: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
f210: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f220: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f230: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f240: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
f250: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
f260: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
f270: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
f280: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
f290: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f2a0: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
f2b0: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
f2c0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
f2d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f2e0: 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69  K ) goto set_chi
f2f0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
f300: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
f310: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
f320: 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
f330: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
f340: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
f350: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
f360: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  );.    rc = ptrm
f370: 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
f380: 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
f390: 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  EE, pgno);.  }..
f3a0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f3b0: 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
f3c0: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
f3d0: 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
f3e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
f3f0: 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77  here on pPage, w
f400: 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65  hich is guarente
f410: 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65  ed to be a btree
f420: 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76   page, not an ov
f430: 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20  erflow.** page, 
f440: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f450: 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69  page iFrom. Modi
f460: 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
f470: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
f480: 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72  s to.** iTo. Par
f490: 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
f4a0: 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
f4b0: 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65  of pointer to be
f4c0: 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a   modified, as .*
f4d0: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
f4e0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
f4f0: 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
f500: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
f510: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
f520: 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
f540: 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
f550: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f560: 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
f570: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
f580: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f590: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
f5c0: 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
f5d0: 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
f5e0: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
f5f0: 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
f600: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
f610: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
f620: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
f630: 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
f640: 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
f650: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
f660: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f670: 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
f680: 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
f690: 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
f6a0: 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
f6b0: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
f6c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f6d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f6e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ex) );.  if( eTy
f6f0: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f700: 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
f710: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
f720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
f730: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
f740: 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
f750: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
f760: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
f770: 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
f780: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f790: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f7a0: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
f7b0: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
f7c0: 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
f7d0: 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
f7e0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
f7f0: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
f800: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
f810: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
f820: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
f830: 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
f840: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
f860: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f870: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f880: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f890: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
f8a0: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
f8b0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
f8c0: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
f8d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f8e0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
f8f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
f900: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f910: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
f920: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
f930: 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
f940: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
f950: 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
f960: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
f970: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
f980: 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
f990: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f9a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f9b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f9c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
f9d0: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
f9e0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
f9f0: 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
fa00: 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
fa10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fa20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fa30: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
fa40: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
fa50: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
fa60: 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
fa70: 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
fa80: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
fa90: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
faa0: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fac0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
fad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
fae0: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
faf0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fb00: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
fb10: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
fb20: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
fb30: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
fb40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fb50: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
fb60: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
fb70: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
fb80: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
fb90: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
fba0: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
fbb0: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
fbc0: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
fbd0: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
fbe0: 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
fbf0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
fc00: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
fc10: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
fc20: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
fc30: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
fc40: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc60: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
fc70: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
fc80: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
fc90: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
fca0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
fcb0: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
fcc0: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
fcd0: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
fce0: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
fcf0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
fd00: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
fd10: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
fd20: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
fd30: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
fd40: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
fd50: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
fd60: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
fd70: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
fd80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
fd90: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
fda0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
fdb0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
fdc0: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
fdd0: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
fde0: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
fdf0: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
fe00: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
fe10: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
fe20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fe30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
fe40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
fe50: 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
fe60: 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
fe70: 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
fe80: 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
fe90: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
fea0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
feb0: 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
fec0: 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
fed0: 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
fee0: 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
fef0: 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
ff00: 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
ff10: 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
ff20: 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
ff30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
ff40: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
ff50: 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
ff60: 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
ff70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ff80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
ff90: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
ffa0: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
ffb0: 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
ffc0: 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
ffd0: 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
ffe0: 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
fff0: 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
10000 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
10010 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
10020 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
10030 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
10040 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
10050 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
10060 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
10070 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
10080 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
10090 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
100a0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
100b0 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
100c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
100d0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
100e0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
100f0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
10100 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
10110 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
10120 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
10130 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
10140 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
10150 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
10160 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
10170 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10180 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10190 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
101a0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
101b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
101c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
101d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
101e0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
101f0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
10200 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
10210 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
10220 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
10230 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
10240 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
10250 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
10260 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
10270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
10290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
102a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
102b0 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
102c0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
102d0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
102e0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
102f0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
10300 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
10310 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
10320 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
10330 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
10340 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
10350 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
10360 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10380 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10390 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
103a0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
103b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
103c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
103d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
103e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
103f0 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
10400 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
10410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10420 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
10430 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
10440 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10450 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10460 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
10470 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
10480 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
10490 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
104a0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
104b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
104c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
104d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
104e0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
104f0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10500 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
10520 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
10530 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10540 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
10550 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20  .  int nPage;.  
10560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10570 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
10580 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72 65  r, &nPage);.  re
10590 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
105a0 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d  _OK?nPage:-1);.}
105b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
105c0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
105d0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
105e0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
105f0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10600 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10610 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
10620 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
10630 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
10640 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
10650 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
10660 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
10670 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
10680 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
10690 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
106a0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
106b0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
106c0 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
106d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
106e0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
106f0 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10700 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10710 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
10720 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
10730 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
10740 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
10750 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
10760 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
10770 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
10780 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
10790 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
107a0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
107b0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
107c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
107d0 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
107e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
107f0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10800 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10810 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
10820 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
10830 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
10840 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
10850 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
10860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10870 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
10880 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
10890 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
108a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
108c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
108d0 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
108e0 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
108f0 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10900 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10910 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
10920 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
10930 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10940 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
10950 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
10960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10970 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10980 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
10990 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
109a0 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
109b0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
109c0 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65  stPg = pagerPage
109d0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
109e0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
109f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10a00 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
10a10 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
10a20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
10a30 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
10a40 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
10a50 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
10a60 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
10a70 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
10a80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
10a90 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
10aa0 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d  List==0 || nFin=
10ab0 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20  =iLastPg ){.    
10ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ad0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10ae0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
10af0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
10b00 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
10b10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10b40 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
10b50 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
10b60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10b70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10b80 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
10b90 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10ba0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
10bb0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
10bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
10bd0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
10be0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
10bf0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
10c00 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
10c10 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
10c20 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
10c30 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
10c40 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
10c50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
10c60 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
10c70 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
10c80 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
10c90 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
10ca0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
10cb0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
10cc0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
10cd0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
10ce0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
10cf0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
10d00 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10d10 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
10d20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10d30 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
10d40 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
10d50 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
10d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10d80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10d90 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
10da0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
10db0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
10dc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
10dd0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
10de0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10df0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
10e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10e10 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
10e20 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
10e30 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
10e40 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
10e50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e60 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10e70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
10e80 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
10e90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10eb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10ec0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
10ed0 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
10ee0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
10ef0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
10f00 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
10f10 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
10f20 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
10f30 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
10f40 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
10f50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10f60 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
10f70 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
10f80 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
10f90 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
10fa0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
10fb0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
10fc0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
10fd0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
10fe0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
10ff0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
11000 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
11010 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
11020 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
11030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
11040 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
11050 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
11060 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
11070 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11090 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
110a0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
110b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
110c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
110d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
110e0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
110f0 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
11100 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
11110 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11120 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
11130 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
11140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11150 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
11160 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
11190 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
111a0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
111b0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
111c0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
111d0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
111e0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
111f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11220 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11230 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c  pBt->nTrunc = iL
11240 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69  astPg - 1;.  whi
11250 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  le( pBt->nTrunc=
11260 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
11270 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
11280 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
11290 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20  >nTrunc) ){.    
112a0 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20  pBt->nTrunc--;. 
112b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
112c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
112d0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
112e0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
112f0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
11300 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
11310 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
11320 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
11330 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
11340 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
11350 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
11360 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
11370 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
11380 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
11390 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
113a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
113b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
113c0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
113d0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
113e0 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  cured,.** SQLITE
113f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11400 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
11410 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
11420 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
11430 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
11440 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11450 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
11460 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
11470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11480 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
11490 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
114a0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
114b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
114c0 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
114d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
114e0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
114f0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
11510 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
11520 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
11530 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
11540 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
11550 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29  cuumStep(pBt, 0)
11560 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
11570 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11590 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
115a0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
115b0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
115c0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
115d0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
115e0 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
115f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
11600 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
11610 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11620 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
11630 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
11640 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11650 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
11660 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
11670 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
11680 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
11690 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
116a0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
116b0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
116c0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
116d0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
116e0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
116f0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
11700 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
11710 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
11720 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54   *pBt, Pgno *pnT
11730 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
11740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
11750 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11760 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e  Bt->pPager;.#ifn
11770 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
11780 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
11790 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
117a0 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
117b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
117c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
117d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
117e0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
117f0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
11800 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
11810 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
11820 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
11830 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  {.    Pgno nFin 
11840 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42  = 0;..    if( pB
11850 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a  t->nTrunc==0 ){.
11860 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65        Pgno nFree
11870 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74  ;.      Pgno nPt
11880 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rmap;.      cons
11890 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
118a0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
118b0 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61    int nOrig = pa
118c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
118d0 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  ->pPager);..    
118e0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
118f0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
11900 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11910 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11920 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
11930 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d       if( nOrig==
11940 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
11950 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
11960 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20    nOrig--;.     
11970 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
11980 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
11990 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
119a0 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61  ]);.      nPtrma
119b0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
119c0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
119d0 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f  Bt, nOrig)+pgsz/
119e0 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20  5)/(pgsz/5);.   
119f0 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
11a00 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
11a10 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  p;.      if( nOr
11a20 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
11a30 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
11a40 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n<=PENDING_BYTE_
11a50 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11a60 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11a70 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
11a80 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
11a90 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
11aa0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
11ab0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
11ac0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
11ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11ae0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
11af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11b00 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11b10 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20  ep(pBt, nFin);. 
11b20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11b30 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
11b40 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69        assert(nFi
11b50 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72  n==0 || pBt->nTr
11b60 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d  unc==0 || nFin<=
11b70 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20  pBt->nTrunc);.  
11b80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11b90 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  OK;.      if( pB
11ba0 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69  t->nTrunc && nFi
11bb0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
11bc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
11bd0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
11be0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11bf0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
11c00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11c10 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  32], 0);.       
11c20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11c30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11c40 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11c50 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69  Bt->nTrunc = nFi
11c60 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11c70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11c90 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
11ca0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
11cb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
11cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11cd0 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70      *pnTrunc = p
11ce0 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20  Bt->nTrunc;.    
11cf0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
11d00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
11d10 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
11d20 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
11d30 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
11d40 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
11d50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11d60 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
11d70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
11d80 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
11d90 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
11da0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
11db0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
11dc0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
11dd0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
11de0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
11df0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
11e00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
11e10 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
11e20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
11e30 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
11e40 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
11e50 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11e60 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
11e70 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
11e80 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
11e90 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
11ea0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
11eb0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
11ec0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
11ed0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
11ee0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
11ef0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
11f00 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
11f10 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
11f20 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
11f30 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
11f40 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
11f50 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
11f60 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11f70 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
11f80 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
11f90 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
11fa0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
11fb0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
11fc0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
11fd0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
11fe0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
11ff0 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12000 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
12010 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
12020 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
12030 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
12040 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
12050 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
12060 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
12070 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12080 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
12090 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
120a0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
120b0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
120c0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
120d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
120e0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
120f0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12100 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12110 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12120 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
12130 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
12140 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12150 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
12160 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12170 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12180 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12190 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
121a0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
121b0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
121c0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
121d0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
121e0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
121f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12200 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12210 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
12220 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
12230 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
12240 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
12250 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12260 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
12270 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12280 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12290 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
122a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
122b0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
122c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
122d0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
122e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
122f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12300 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12320 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
12330 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
12340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12350 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
12360 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
12370 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12380 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12390 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
123a0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
123b0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
123c0 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
123d0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
123e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
123f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12400 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
12430 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
12440 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
12450 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
12460 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
12470 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
12480 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12490 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
124a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
124b0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
124c0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
124d0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
124e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
124f0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12500 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12510 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
12520 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
12530 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
12540 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
12550 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
12560 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
12570 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12580 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12590 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
125a0 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
125b0 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
125c0 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
125d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
125e0 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
125f0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12600 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12610 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
12620 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
12630 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
12640 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
12650 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
12660 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
12670 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
12680 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12690 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
126a0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
126b0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
126c0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
126d0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
126e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
126f0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
12700 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
12710 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
12720 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
12730 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
12740 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
12750 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
12760 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
12770 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12780 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12790 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
127a0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
127b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
127c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
127d0 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
127e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
127f0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
12800 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
12810 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12820 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
12830 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
12840 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
12850 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
12860 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
12870 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
12880 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
12890 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
128a0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
128b0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
128c0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
128d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
128e0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
128f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12920 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12930 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12940 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
12950 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12960 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
12970 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
12980 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
12990 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
129a0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
129b0 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
129c0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
129d0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
129e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
129f0 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
12a00 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
12a10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12a20 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
12a30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
12a40 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
12a50 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
12a60 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12a70 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
12a80 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
12a90 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
12aa0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
12ab0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
12ac0 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
12ad0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
12ae0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
12af0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
12b00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12b10 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
12b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12b30 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
12b40 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12b50 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
12b60 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
12b70 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
12b80 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
12b90 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
12ba0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
12bb0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
12bc0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
12bd0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
12be0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12bf0 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
12c00 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
12c10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12c20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12c30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12c40 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
12c50 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
12c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12c70 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
12c80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12c90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12ca0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
12cb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12cc0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
12cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12ce0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12cf0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12d00 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
12d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12d20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12d30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
12d40 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
12d50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
12d60 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
12d70 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
12d80 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
12d90 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
12da0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
12db0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
12dc0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
12dd0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
12de0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
12df0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
12e00 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
12e10 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
12e20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
12e30 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
12e40 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12e50 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
12e60 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
12e70 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
12e80 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
12e90 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
12ea0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
12eb0 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
12ec0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
12ed0 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
12ee0 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
12ef0 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
12f00 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
12f10 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
12f20 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
12f30 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
12f40 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
12f50 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
12f60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
12f70 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
12f80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
12f90 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
12fa0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
12fb0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
12fc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12fd0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
12fe0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
12ff0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13000 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
13010 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
13020 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
13030 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
13040 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
13050 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
13060 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
13070 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
13080 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
13090 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
130a0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
130b0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
130c0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
130d0 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
130e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
130f0 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13100 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13110 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
13120 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
13130 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
13140 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
13150 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
13160 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
13170 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
13180 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13190 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
131a0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
131b0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
131c0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
131d0 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
131e0 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
131f0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13200 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
13210 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
13220 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
13230 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
13240 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
13250 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
13260 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
13270 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
13280 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13290 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
132a0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
132b0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
132c0 78 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75  xt){.    clearCu
132d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
132e0 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
132f0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
13300 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72     p->skip = err
13310 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Code;.  }.  sqli
13320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
13330 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
13340 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
13350 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
13360 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
13370 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
13380 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
13390 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
133a0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
133b0 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
133c0 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
133d0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
133e0 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
133f0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
13400 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
13410 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
13420 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
13430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13440 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
13450 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
13460 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
13470 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
13480 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
13490 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
134a0 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
134b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
134c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
134d0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
134e0 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
134f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13500 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
13510 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  b;.  rc = saveAl
13520 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
13530 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
13540 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13550 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
13560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13570 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
13580 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
13590 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
135a0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
135b0 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
135c0 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
135d0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
135e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
135f0 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
13600 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
13610 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
13620 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
13630 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
13640 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
13650 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
13660 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
13670 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
13680 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
13690 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
136a0 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
136b0 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
136c0 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
136d0 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
136e0 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
136f0 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
13700 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
13710 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
13720 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
13730 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13740 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
13750 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
13760 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
13770 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75  ntegrity(p);.  u
13780 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
13790 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
137a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
137b0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
137c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
137d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
137e0 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  M.    pBt->nTrun
137f0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
13800 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
13810 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
13820 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
13830 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
13840 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
13850 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
13860 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
13870 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13880 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
13890 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
138a0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
138b0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
138c0 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
138d0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69      ** call sqli
138e0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
138f0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
13900 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
13910 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
13920 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
13930 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
13940 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13950 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
13960 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
13970 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
13980 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
139a0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
139b0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
139c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
139d0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
139e0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  READ;.  }..  if(
139f0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
13a00 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61  NS_NONE ){.    a
13a10 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
13a20 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
13a30 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
13a40 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30  ion--;.    if( 0
13a50 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
13a60 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
13a70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13a80 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13a90 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e    }.  }..  p->in
13aa0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13ab0 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  NE;.  pBt->inStm
13ac0 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42  t = 0;.  unlockB
13ad0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13ae0 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
13af0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
13b00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13b20 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
13b30 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13b40 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75  saction.  The su
13b50 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
13b60 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13b70 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  d back independe
13b80 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
13b90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13ba0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
13bb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
13bc0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
13bd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  subtransaction..
13be0 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  ** The subtransa
13bf0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
13c00 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20  utomatically if 
13c10 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
13c20 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  tion.** commits 
13c30 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
13c40 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75  *.** Only one su
13c50 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79  btransaction may
13c60 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20   be active at a 
13c70 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20  time.  It is an 
13c80 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20  error to try.** 
13c90 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
13ca0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  ubtransaction if
13cb0 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e   another subtran
13cc0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
13cd0 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  dy active..**.**
13ce0 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
13cf0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
13d00 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
13d10 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
13d20 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
13d30 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
13d40 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
13d50 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
13d60 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
13d70 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
13d80 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
13d90 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
13da0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
13db0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
13dc0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
13dd0 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
13de0 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
13df0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
13e00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
13e10 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
13e20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
13e30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13e40 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
13e50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13e60 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13e70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72  ;.  if( (p->inTr
13e80 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
13e90 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ) || pBt->inStmt
13ea0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
13eb0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
13ec0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
13ed0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
13ee0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
13ef0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
13f00 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
13f10 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42  E );.    rc = pB
13f20 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
13f30 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
13f40 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
13f50 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13f60 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
13f70 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
13f80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13f90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13fa0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
13fb0 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61   statment subtra
13fc0 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
13fd0 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  ly in progress. 
13fe0 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61   If no.** subtra
13ff0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14000 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ve, this is a no
14010 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
14020 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
14030 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
14040 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
14050 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14070 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
14080 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
14090 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
140a0 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
140b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
140c0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
140d0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
140e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
140f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14100 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
14110 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
14120 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14130 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14140 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
14150 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
14160 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
14170 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e  .  If no subtran
14180 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63  saction.** is ac
14190 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e  tive this routin
141a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
141b0 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
141c0 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
141d0 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ted by this oper
141e0 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
141f0 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20  mpt.** to use a 
14200 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20  cursor that was 
14210 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
14220 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
14230 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  eration.** will 
14240 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
14250 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
14260 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
14270 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
14280 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14290 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
142a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
142b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
142c0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
142d0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
142e0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21  pBt->inStmt && !
142f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14300 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14310 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
14320 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
14330 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
14340 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
14350 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14360 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14370 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14380 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14390 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
143a0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
143b0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
143c0 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
143d0 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
143e0 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
143f0 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14400 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14410 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
14420 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
14430 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
14440 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
14450 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
14460 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
14470 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
14480 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14490 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
144a0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
144b0 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
144c0 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
144d0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
144e0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
144f0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14500 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14510 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
14520 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
14530 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
14540 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
14550 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
14560 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14570 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
14580 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14590 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
145a0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
145b0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
145c0 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
145d0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
145e0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
145f0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14600 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14610 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
14620 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
14630 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
14640 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
14650 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
14660 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
14670 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
14680 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14690 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
146a0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
146b0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
146c0 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
146d0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
146e0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
146f0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14700 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14710 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
14720 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
14730 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
14740 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
14750 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
14760 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
14770 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
14780 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14790 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
147a0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
147b0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
147c0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
147d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14800 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
14830 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
14840 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
14850 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14880 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14890 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
148a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
148b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
148c0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
148d0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
148e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
148f0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14910 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
14920 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
14930 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14940 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
14950 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
14960 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
14970 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14990 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
149a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
149b0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
149c0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
149d0 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
149e0 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
149f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a00 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
14a10 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
14a20 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
14a30 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
14a40 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
14a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14a70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
14a80 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14a90 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20   && wrFlag ){.  
14aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14ab0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14ac0 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  }.  }.  pCur->pg
14ad0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
14ae0 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61  Table;.  if( iTa
14af0 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50  ble==1 && pagerP
14b00 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
14b10 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
14b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
14b30 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
14b40 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
14b50 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
14b60 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
14b70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
14b80 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
14b90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
14ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14bb0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
14bc0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
14bd0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
14be0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
14bf0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
14c00 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
14c10 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
14c20 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b   variables, link
14c30 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
14c40 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
14c50 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75  st and set *ppCu
14c60 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70  r (the.  ** outp
14c70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
14c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20  his function).. 
14c90 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79   */.  pCur->pKey
14ca0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
14cb0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
14cc0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
14cd0 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
14ce0 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
14cf0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
14d00 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
14d10 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14d20 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
14d30 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
14d40 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
14d50 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
14d60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
14d70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a  URSOR_INVALID;..
14d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d90 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
14da0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
14db0 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
14dc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
14dd0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  ->pPage);.  }.  
14de0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14df0 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
14e00 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
14e10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
14e20 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14e50 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
14e60 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e90 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
14ea0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
14eb0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
14ee0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
14ef0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
14f00 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
14f10 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
14f20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
14f30 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
14f40 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
14f50 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
14f80 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
14f90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
14fa0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14fb0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
14fc0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
14fd0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
14fe0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
14ff0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
15000 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15010 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15020 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15030 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
15040 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  ize(){.  return 
15050 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
15060 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ;.}..../*.** Clo
15070 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
15080 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
15090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
150a0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
150b0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
150c0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
150d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
150e0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
150f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15100 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
15110 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
15120 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
15130 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
15140 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
15150 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
15160 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15170 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
15180 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61  ee->db;.    clea
15190 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
151a0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
151b0 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
151c0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
151d0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
151e0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
151f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15200 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15210 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15220 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15230 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15240 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15250 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
15270 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
15280 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15290 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
152a0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
152b0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
152c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
152d0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
152e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
152f0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
15300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
15320 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15330 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
15340 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
15350 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
15360 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15370 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
15380 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
15390 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
153a0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
153b0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
153c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
153d0 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
153e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
153f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15400 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ) );.  memcpy(pT
15410 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69  empCur, pCur, si
15420 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
15430 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
15440 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
15450 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
15460 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  ( pTempCur->pPag
15470 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15480 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
15490 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
154a0 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
154b0 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
154c0 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
154d0 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
154e0 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
154f0 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
15500 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
15510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15520 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
15530 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
15540 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15550 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15560 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
15570 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
15580 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
15590 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
155a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
155b0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
155c0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
155d0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
155e0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
155f0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
15600 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
15610 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
15620 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
15630 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
15640 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
15650 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
15660 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
15670 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
15680 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
15690 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
156a0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
156b0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
156c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
156d0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
156e0 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
156f0 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
15700 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
15710 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
15720 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
15730 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
15740 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
15750 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
15760 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
15770 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
15780 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
15790 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
157a0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
157b0 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
157c0 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
157d0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
157e0 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
157f0 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
15800 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
15810 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
15820 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
15830 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
15840 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
15850 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
15860 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
15870 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
15880 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
15890 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
158a0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
158b0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
158c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
158d0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
158e0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
158f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
15900 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
15910 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
15920 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
15930 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  >idx, &info);.  
15940 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
15950 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
15960 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
15970 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
15980 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
15990 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
159a0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
159b0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
159c0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
159d0 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
159e0 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
159f0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
15a00 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
15a10 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
15a20 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
15a30 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15a40 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
15a50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15a60 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
15a70 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
15a80 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
15a90 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
15aa0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
15ab0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
15ac0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
15ad0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
15ae0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
15af0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
15b00 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
15b10 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
15b20 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
15b30 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
15b40 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
15b50 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
15b90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
15ba0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
15be0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15bf0 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
15c00 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
15c10 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20  );         \.   
15c20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
15c30 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15cb0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
15cc0 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
15d00 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
15d10 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
15d20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
15d30 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
15d40 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
15d50 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
15d60 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
15d70 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
15d80 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
15d90 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
15da0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
15db0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
15dc0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
15dd0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
15de0 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
15df0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
15e00 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
15e10 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
15e20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15e30 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
15e40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15e50 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
15e60 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
15e70 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
15e80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
15e90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
15ea0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
15eb0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
15ec0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
15ed0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
15ef0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
15f00 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15f10 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
15f20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
15f30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
15f40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15f50 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
15f60 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
15f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
15f80 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
15f90 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
15fa0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
15fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15fd0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
15fe0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15ff0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
16000 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
16010 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
16020 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
16030 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
16040 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
16050 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
16060 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
16070 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
16080 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
16090 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
160a0 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
160b0 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
160c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
160d0 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
160e0 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
160f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16100 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
16110 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
16120 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
16130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
16140 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
16150 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
16160 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
16170 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
16180 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
161a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
161b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
161c0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
161d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
161e0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
161f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16200 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
16210 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
16220 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
16230 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
16240 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
16250 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
16260 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
16270 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
16280 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
16290 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
162a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
162b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
162c0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
162d0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
162e0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
162f0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
16300 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
16310 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
16320 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
16330 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
16340 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
16350 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
16360 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
16370 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
16380 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
16390 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
163a0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
163b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
163c0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
163d0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
163e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
163f0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
16400 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
16410 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
16420 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  e:.**.** Unless 
16430 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c  pPgnoNext is NUL
16440 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  L, the page numb
16450 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
16460 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
16470 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
16480 69 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  ist is written t
16490 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
164a0 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73   page ovfl.** is
164b0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
164c0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73  n its linked lis
164d0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
164e0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
164f0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
16500 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50  s not NULL, *ppP
16510 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
16520 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c  e MemPage* handl
16530 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76  e.** for page ov
16540 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69  fl. The underlyi
16550 6e 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61  ng pager page ma
16560 79 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  y have been requ
16570 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ested.** with th
16580 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
16590 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67   set, so the pag
165a0 65 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c  e data accessabl
165b0 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61  e via.** this ha
165c0 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  ndle may not be 
165d0 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  trusted..*/.stat
165e0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
165f0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
16600 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
16610 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
16620 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
16630 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
16640 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
16650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16660 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
16670 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  le */.  Pgno *pP
16680 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
16690 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
166a0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
166b0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
166c0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
166d0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
166e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
166f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
16700 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66  ) );.  /* One of
16710 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20   these must not 
16720 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  be NULL. Otherwi
16730 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69  se, why call thi
16740 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20  s function? */. 
16750 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c   assert(ppPage |
16760 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20  | pPgnoNext);.. 
16770 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74   /* If pPgnoNext
16780 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
16790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
167a0 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20  being called to 
167b0 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65  obtain.  ** a Me
167c0 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65  mPage* reference
167d0 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64   only. No page-d
167e0 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
167f0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16800 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e  */.  if( !pPgnoN
16810 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ext ){.    retur
16820 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n sqlite3BtreeGe
16830 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
16840 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d   ppPage, 1);.  }
16850 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16860 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16870 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
16880 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
16890 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
168a0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
168b0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
168c0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
168d0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
168e0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
168f0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
16900 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
16910 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
16920 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
16930 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
16940 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
16950 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
16960 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
16970 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
16980 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
16990 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
169a0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
169b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
169c0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
169d0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
169e0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
169f0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
16a00 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
16a10 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
16a20 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
16a30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16a40 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
16a50 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
16a60 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
16a70 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
16a80 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
16a90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
16aa0 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
16ab0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
16ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54    }.      if( eT
16b00 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16b10 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
16b20 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
16b30 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
16b40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16b50 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65  #endif..  if( ne
16b60 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20  xt==0 || ppPage 
16b70 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
16b80 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  pPage = 0;..    
16b90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16ba0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
16bb0 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74  fl, &pPage, next
16bc0 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  !=0);.    assert
16bd0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
16be0 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20  | pPage==0);.   
16bf0 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20   if( next==0 && 
16c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16c10 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
16c20 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
16c30 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ata);.    }..   
16c40 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
16c50 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
16c60 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Page;.    }else{
16c70 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16c80 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
16c90 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78  .  }.  *pPgnoNex
16ca0 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74  t = next;..  ret
16cb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16cc0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
16cd0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
16ce0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
16cf0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
16d00 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
16d10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
16d20 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
16d30 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
16d40 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
16d50 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
16d60 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
16d70 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
16d80 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
16d90 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
16da0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
16db0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
16dc0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
16dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16de0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
16df0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
16e00 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
16e10 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
16e20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
16e30 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
16e40 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
16e50 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
16e60 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
16e70 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
16e80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16e90 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
16ea0 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
16eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
16ec0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
16ed0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
16ee0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
16ef0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
16f00 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
16f10 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
16f20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f30 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
16f40 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16f60 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
16f70 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
16f80 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
16f90 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
16fa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
16fb0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
16fc0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
16fd0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
16fe0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
16ff0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
17000 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
17010 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
17020 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17030 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
17040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17050 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17060 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17070 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
17080 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
17090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
170a0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
170b0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
170c0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
170d0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
170e0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
170f0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
17100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17120 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
17130 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
17140 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
17150 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
17160 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
17170 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
17180 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
17190 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
171a0 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
171b0 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
171c0 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
171d0 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
171e0 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
171f0 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
17200 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
17210 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
17220 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
17230 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
17240 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
17250 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
17260 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
17270 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
17280 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
17290 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
172a0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
172b0 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
172c0 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
172d0 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
172e0 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72  It just reads or
172f0 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72   writes bytes fr
17300 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
17310 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
17320 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74   .** appear on t
17330 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
17340 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
17350 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
17360 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e  rflow .** pages.
17370 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
17380 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
17390 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
173a0 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
173b0 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
173c0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
173d0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
173e0 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
173f0 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
17400 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
17410 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
17420 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17430 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
17440 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
17450 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
17460 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
17470 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
17480 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
17490 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
174a0 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
174b0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
174c0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
174d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
174e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
174f0 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
17500 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
17510 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
17520 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
17530 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
17540 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
17550 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
17560 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
17570 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
17580 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
17590 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
175a0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
175b0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
175c0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
175d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
175e0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
175f0 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
17600 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
17610 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
17620 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
17630 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
17640 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
17650 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
17660 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
17670 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
17680 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
17690 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
176a0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
176b0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
176c0 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20  int offset,     
176d0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
176e0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
176f0 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
17700 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
17710 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
17720 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
17730 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17740 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
17750 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
17760 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
17770 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20    int skipKey,  
17780 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
17790 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
177a0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
177b0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  */.  int eOp    
177c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
177d0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
177e0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
177f0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
17800 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
17810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17820 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
17830 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
17840 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17850 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
17860 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
17870 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63 75  ge of current cu
17880 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rsor entry */.  
17890 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
178c0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
178d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
178e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
178f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17900 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17910 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17920 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
17930 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
17940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
17950 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
17960 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
17970 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
17980 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
17990 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
179a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
179b0 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
179c0 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
179d0 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
179e0 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66   ? 0 : pCur->inf
179f0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
17a00 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
17a10 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
17a20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
17a30 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
17a40 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
17a50 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
17a60 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
17a70 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
17a80 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
17a90 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
17aa0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17ab0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
17ac0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
17ad0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
17ae0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
17af0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
17b00 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
17b10 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
17b20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
17b30 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
17b40 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
17b50 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
17b60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
17b70 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
17b80 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
17b90 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
17ba0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
17bb0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
17bc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
17bd0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
17be0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
17bf0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
17c00 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
17c10 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
17c20 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43  .  }..  pBt = pC
17c30 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 72  ur->pBt;.  if( r
17c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17c50 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
17c60 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20  st int ovflSize 
17c70 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
17c80 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
17c90 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
17ca0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
17cb0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
17cc0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
17cd0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
17ce0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17cf0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
17d00 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
17d10 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
17d20 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
17d30 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
17d40 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
17d50 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
17d60 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
17d70 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
17d80 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
17d90 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
17da0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
17db0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
17dc0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
17dd0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
17de0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
17df0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
17e00 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
17e10 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
17e20 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
17e30 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
17e40 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
17e50 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
17e60 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
17e70 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
17e80 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
17e90 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
17ea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
17eb0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
17ec0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
17ed0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
17ee0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
17ef0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
17f00 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
17f10 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
17f20 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
17f30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
17f40 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
17f50 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
17f60 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
17f70 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
17f80 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
17f90 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
17fa0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17fc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
17fd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
17fe0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
17ff0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
18000 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
18010 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
18020 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
18030 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
18040 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
18050 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
18060 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
18070 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
18080 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
18090 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
180a0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
180b0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
180c0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
180d0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
180e0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
180f0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
18100 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
18110 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
18120 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
18130 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
18140 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
18150 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18160 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18170 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
18180 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
18190 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
181a0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
181b0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
181c0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
181d0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
181e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
181f0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
18200 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
18210 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
18220 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
18230 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
18240 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18250 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
18260 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
18270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
18280 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
18290 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
182a0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
182b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
182c0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
182d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
182e0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
182f0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
18300 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
18310 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
18320 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
18330 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
18340 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
18350 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
18360 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
18370 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
18380 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
18390 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
183a0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
183b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
183c0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
183d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
183e0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
183f0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
18400 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
18410 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
18420 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
18430 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
18440 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
18450 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
18460 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
18470 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
18480 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
18490 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
184a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
184b0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
184c0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
184d0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
184e0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
184f0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
18500 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
18510 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
18520 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
18530 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
18540 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
18550 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
18560 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
18570 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18580 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
18590 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
185a0 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
185b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
185c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
185d0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
185e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
185f0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
18600 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
18610 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
18620 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
18630 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
18640 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
18650 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
18660 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
18670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18680 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
18690 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
186a0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
186b0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
186c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
186d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
186e0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
186f0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
18700 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
18710 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
18720 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
18730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18740 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
18750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
18760 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
18770 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18780 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
18790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
187a0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
187b0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
187c0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
187d0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
187e0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
187f0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18800 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18810 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18820 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18830 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18840 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18850 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18860 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18870 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18880 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18890 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
188a0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
188b0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
188c0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
188e0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
188f0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18900 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18910 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
18920 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18930 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
18940 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
18950 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18960 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
18970 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
18990 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
189a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
189b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
189c0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
189d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
189e0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
189f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18a00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18a10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18a20 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18a30 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
18a40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18a50 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18a60 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
18a70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
18a80 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
18a90 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
18aa0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
18ab0 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a  r*)pBuf, 0, 0);.
18ac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18ae0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
18af0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18b00 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
18b10 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
18b20 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
18b30 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
18b40 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
18b50 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
18b60 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
18b70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18b80 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
18b90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
18ba0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
18bb0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
18bc0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
18bd0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
18be0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
18bf0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
18c00 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
18c10 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
18c20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
18c30 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
18c40 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
18c50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
18c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c70 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
18c80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18c90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
18ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18cb0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
18cc0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
18cd0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
18ce0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
18cf0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
18d00 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
18d10 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
18d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
18d30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18d40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18d50 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
18d60 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
18d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18d80 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18d90 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18da0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18db0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
18dc0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18dd0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
18de0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18df0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18e00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18e10 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
18e20 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
18e30 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
18e40 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
18e50 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
18e60 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
18e70 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
18e80 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
18e90 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
18ea0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
18eb0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
18ec0 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
18ed0 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
18ee0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
18ef0 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
18f00 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
18f10 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
18f20 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
18f30 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
18f40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
18f50 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
18f60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18f70 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
18f80 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
18f90 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
18fa0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
18fb0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
18fc0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
18fd0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
18fe0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
18ff0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
19000 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
19010 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
19020 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
19030 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
19040 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
19050 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
19060 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
19070 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
19080 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
19090 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
190a0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
190b0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a   to reassembly.*
190c0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
190d0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
190e0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
190f0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
19100 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19110 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
19120 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
19130 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
19140 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
19150 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
19160 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
19170 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
19180 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
19190 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
191a0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
191b0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
191c0 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
191d0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
191e0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
191f0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19200 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
19210 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
19220 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
19230 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
19240 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
19250 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
19260 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
19270 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
19280 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
19290 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
192a0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
192b0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
192c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
192d0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
192e0 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  nt nLocal;..  as
192f0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
19300 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
19310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19320 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19330 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
19340 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19350 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19360 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
19370 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
19380 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19390 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
193a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
193b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
193c0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
193d0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
193e0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
193f0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
19400 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
19410 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
19420 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
19430 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
19440 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
19450 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
19460 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
19470 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
19480 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
19490 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
194a0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
194b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
194c0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
194d0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
194e0 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
194f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
19500 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
19510 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
19520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
19530 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
19540 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
19550 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
19560 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
19570 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
19580 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
19590 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
195a0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
195b0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
195c0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
195d0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
195e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
195f0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
19600 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
19610 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
19620 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
19630 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
19640 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
19650 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
19660 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
19670 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
19680 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
19690 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
196a0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
196b0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
196c0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
196d0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
196e0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
196f0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
19700 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
19710 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
19720 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
19730 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
19740 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
19750 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
19760 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
19770 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
19780 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
19790 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
197a0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
197b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
197c0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
197d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
197e0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
197f0 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
19800 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
19810 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
19820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19830 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
19840 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
19850 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
19860 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
19870 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19880 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19890 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
198a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
198b0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
198c0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
198d0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
198e0 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
198f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19900 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19910 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
19920 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
19930 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
19940 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
19950 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
19960 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
19970 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
19980 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19990 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
199a0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
199b0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
199c0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
199d0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
199e0 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ldPage;.  BtShar
199f0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19a00 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19a10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19a20 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19a30 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19a40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19a50 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ;.  rc = getAndI
19a60 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
19a70 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c  Pgno, &pNewPage,
19a80 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
19a90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19aa0 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d   rc;.  pNewPage-
19ab0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75  >idxParent = pCu
19ac0 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61  r->idx;.  pOldPa
19ad0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19ae0 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64  ;.  pOldPage->id
19af0 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65  xShift = 0;.  re
19b00 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61  leasePage(pOldPa
19b10 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
19b20 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  ge = pNewPage;. 
19b30 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
19b40 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
19b50 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
19b60 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
19b70 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
19b80 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
19b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19ba0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
19bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19bd0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
19be0 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61  ge is the virtua
19bf0 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61  l root of its ta
19c00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ble..**.** The v
19c10 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
19c20 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
19c30 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65  e for most table
19c40 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74  s.  But.** for t
19c50 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
19c60 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74  on page 1, somet
19c70 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  ime the real roo
19c80 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70  t page.** is emp
19c90 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ty except for th
19ca0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e  e right-pointer.
19cb0 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
19cc0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  the.** virtual r
19cd0 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
19ce0 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69  page that the ri
19cf0 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70  ght-pointer of p
19d00 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e  age.** 1 is poin
19d10 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
19d20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
19d30 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  otPage(MemPage *
19d40 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
19d50 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61  e *pParent;..  a
19d60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19d70 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
19d80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
19d90 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
19da0 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
19db0 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
19dc0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
19dd0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
19de0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19df0 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
19e00 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
19e10 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
19e20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19e30 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19e40 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19e50 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
19e60 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
19e70 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
19e80 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
19e90 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
19ea0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
19eb0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
19ec0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
19ed0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
19ee0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
19ef0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
19f00 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
19f10 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
19f20 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
19f30 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
19f40 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
19f50 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
19f60 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
19f70 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
19f80 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  age *pParent;.  
19f90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
19fa0 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b    int idxParent;
19fb0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
19fc0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19fd0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
19fe0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19ff0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a000 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1a010 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1a020 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
1a030 65 72 74 28 20 21 73 71 6c 69 74 65 33 42 74 72  ert( !sqlite3Btr
1a040 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1a050 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  ge) );.  pParent
1a060 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
1a070 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
1a080 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78  rent!=0 );.  idx
1a090 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
1a0a0 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  idxParent;.  sql
1a0b0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
1a0c0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
1a0d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1a0e0 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
1a0f0 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  age = pParent;. 
1a100 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a110 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1a120 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1a130 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a140 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a  >idxShift==0 );.
1a150 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64    pCur->idx = id
1a160 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xParent;.}../*.*
1a170 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a180 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1a190 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1a1a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1a1b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1a1c0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1a1d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a1e0 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1a1f0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1a200 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a210 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1a220 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a230 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a240 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a250 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1a260 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a270 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a280 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1a290 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a2a0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1a2b0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1a2c0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1a2d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1a2e0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1a2f0 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1a300 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a310 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1a320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1a330 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1a340 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
1a350 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1a360 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
1a370 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1a380 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d   pRoot && pRoot-
1a390 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1a3a0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73  oRoot ){.    ass
1a3b0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
1a3c0 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  it );.  }else{. 
1a3d0 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1a3e0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1a3f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1a400 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1a410 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
1a420 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1a430 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a440 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1a450 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a460 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1a470 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
1a480 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
1a490 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70  = pRoot;.  }.  p
1a4a0 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
1a4b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a4c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1a4d0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1a4e0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1a4f0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
1a500 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
1a510 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1a520 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
1a530 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1a540 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
1a550 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
1a560 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
1a570 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
1a580 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
1a590 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
1a5a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a5b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
1a5c0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1a5d0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
1a5e0 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
1a5f0 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
1a600 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
1a610 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
1a620 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
1a630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a640 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a650 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1a660 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1a670 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a680 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
1a690 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1a6a0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
1a6b0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
1a6c0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
1a6d0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
1a6e0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
1a6f0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
1a700 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a710 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1a720 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1a730 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a740 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a760 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a770 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a780 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a7a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a7b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a7c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a7d0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a7e0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a7f0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a800 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a810 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a820 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a830 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a840 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a850 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a860 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a870 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a890 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a8a0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a8b0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1a8c0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a8d0 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1a8e0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a8f0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a900 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1a910 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1a920 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1a930 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1a940 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1a950 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1a960 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1a970 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a980 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1a990 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1a9a0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1a9b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a9c0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a9d0 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1a9e0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1a9f0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1aa00 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1aa10 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1aa20 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1aa30 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1aa40 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1aa50 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1aa60 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1aa70 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1aa80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1aa90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1aaa0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1aab0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1aac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1aad0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1aae0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1aaf0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1ab00 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1ab10 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1ab20 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1ab30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ab40 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1ab50 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1ab60 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1ab70 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1ab80 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1ab90 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1aba0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1abb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1abc0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1abd0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70  nCell - 1;.    p
1abe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1abf0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1ac00 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1ac10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ac20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
1ac30 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ac40 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1ac50 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ac60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1ac70 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ac80 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1ac90 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1aca0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1acb0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1acc0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1acd0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ace0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1acf0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1ad00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ad10 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ad20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1ad30 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1ad40 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1ad50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ad60 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1ad70 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1ad80 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1ad90 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1ada0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1adb0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1adc0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1add0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1ade0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1adf0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1ae00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1ae10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1ae20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1ae30 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1ae40 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1ae50 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
1ae60 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1ae70 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1ae80 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1ae90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1aea0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1aeb0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
1aec0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1aed0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1aee0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1aef0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1af00 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1af10 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1af20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1af30 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1af40 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1af50 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1af60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1af70 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
1af80 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1af90 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
1afa0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1afb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1afc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1afd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1afe0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1aff0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b000 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b010 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1b020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b030 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1b040 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1b050 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
1b060 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b070 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b080 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1b0a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b0b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b0c0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b0d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1b0e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1b0f0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74  pCur);.      get
1b100 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b110 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1b120 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1b130 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1b140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b150 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b160 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1b170 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
1b180 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
1b190 73 70 65 63 69 66 69 65 64 20 62 79 20 70 4b 65  specified by pKe
1b1a0 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52  y/nKey/pUnKey. R
1b1b0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
1b1c0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
1b1d0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f  INTKEY tables, o
1b1e0 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72  nly the nKey par
1b1f0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1b200 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55   pKey .** and pU
1b210 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c  nKey must be NUL
1b220 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1b230 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e  bles, either pUn
1b240 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e  Key.** must poin
1b250 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  t to a key that 
1b260 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b270 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c   unpacked, or el
1b280 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20  se.** pKey/nKey 
1b290 64 65 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62  describes a blob
1b2a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1b2b0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  key..**.** If an
1b2c0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1b2d0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1b2e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1b2f0 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1b300 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1b310 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1b320 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1b330 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1b340 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1b350 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1b360 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1b370 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1b380 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1b390 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1b3a0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1b3b0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1b3c0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1b3d0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1b3e0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1b3f0 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1b400 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1b410 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1b420 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1b430 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1b440 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b450 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b460 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b470 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b480 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1b490 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1b4a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1b4b0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1b4c0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1b4d0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1b4e0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1b4f0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1b500 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1b510 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b520 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b530 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b540 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b550 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1b560 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1b570 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1b580 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b590 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b5a0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1b5d0 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  pKey..**.*/.int 
1b5e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1b5f0 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1b600 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1b610 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1b620 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1b630 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b640 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1b650 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1b660 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1b670 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61  tables */.  Unpa
1b680 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b  ckedRecord *pUnK
1b690 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ey,/* Unpacked v
1b6a0 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a  ersion of pKey *
1b6b0 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1b6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b6d0 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20  ze of pKey.  Or 
1b6e0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  the key for tabl
1b6f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1b700 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f  Right,         /
1b710 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1b720 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1b730 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1b740 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1b750 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
1b760 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a   result flag */.
1b770 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1b780 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b  har aSpace[200];
1b790 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b7a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b7b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b7c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b7d0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1b7e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1b7f0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1b800 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1b810 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1b820 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1b830 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1b840 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1b850 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1b860 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1b870 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1b880 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b890 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1b8a0 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61  Key && pCur->pPa
1b8b0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1b8c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1b8d0 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20  .nKey==nKey ){. 
1b8e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1b8f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b900 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b910 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1b920 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1b930 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20  .nKey<nKey ){.  
1b940 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1b950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b960 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b970 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  }...  rc = moveT
1b980 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1b990 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1b9a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1b9b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b9c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1b9d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
1b9e0 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
1b9f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ba00 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1ba10 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1ba20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1ba30 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1ba40 0a 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 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1ba60 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
1ba70 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57  tKey ){.    /* W
1ba80 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53  e are given an S
1ba90 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72  QL table to sear
1baa0 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ch.  The key is 
1bab0 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20  the integer.    
1bac0 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e  ** rowid contain
1bad0 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65  ed in nKey.  pKe
1bae0 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f  y and pUnKey sho
1baf0 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c  uld both be NULL
1bb00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1bb10 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  pUnKey==0 );.   
1bb20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30   assert( pKey==0
1bb30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
1bb40 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  pUnKey==0 ){.   
1bb50 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65   /* We are to se
1bb60 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65  arch an SQL inde
1bb70 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e  x using a key en
1bb80 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e  coded as a blob.
1bb90 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62  .    ** The blob
1bba0 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65   is found at pKe
1bbb0 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79  y and is nKey by
1bbc0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20  tes in length.  
1bbd0 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68  Unpack.    ** th
1bbe0 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77  is key so that w
1bbf0 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f  e can use it. */
1bc00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
1bc10 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b  y!=0 );.    pUnK
1bc20 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1bc30 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1bc40 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
1bc50 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
1bc80 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
1bc90 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  e));.    if( pUn
1bca0 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1bcb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65  }else{.    /* We
1bcd0 20 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61   are to search a
1bce0 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e  n SQL index usin
1bcf0 67 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  g a key that is 
1bd00 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64  already unpacked
1bd10 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64  .    ** and hand
1bd20 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b  ed to us in pUnK
1bd30 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ey. */.    asser
1bd40 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  t( pKey==0 );.  
1bd50 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  }.  for(;;){.   
1bd60 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1bd70 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1bd80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1bd90 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1bda0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1bdb0 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1bdc0 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1bdd0 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1bde0 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1bdf0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1be00 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1be10 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
1be20 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a  && pUnKey==0 ){.
1be30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1be40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1be50 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1be60 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1be70 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1be80 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1be90 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
1bea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1beb0 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
1bec0 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1bed0 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1bee0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1bef0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1bf00 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1bf10 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1bf20 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1bf30 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1bf40 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1bf50 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1bf60 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1bf70 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1bf80 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1bf90 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1bfa0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
1bfb0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
1bfc0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
1bfd0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
1bfe0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
1bff0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
1c000 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
1c010 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
1c020 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
1c030 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
1c040 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
1c050 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1c060 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  Key==nKey ){.   
1c070 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1c080 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c090 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b  nCellKey<nKey ){
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1c0b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c0c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1c0d0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  rt( nCellKey>nKe
1c0e0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1c0f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1c100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c110 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1c120 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1c130 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1c140 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1c150 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1c160 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1c170 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1c180 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1c190 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1c1a0 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1c1b0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c1c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c1d0 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c1e0 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c1f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c200 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c210 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1c220 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20   nCellKey );.   
1c230 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1c240 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1c250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c260 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1c270 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c280 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1c290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1c2a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c2b0 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
1c2c0 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
1c2d0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c2e0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c2f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c300 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c310 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c330 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1c340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c350 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1c360 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1c370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c380 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1c390 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1c3a0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1c3b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c3c0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1c3d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c3e0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1c3f0 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20  ur->idx;.       
1c400 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
1c410 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c420 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c430 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1c440 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
1c450 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1c460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c470 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c480 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1c490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c4a0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1c4b0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1c4c0 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1c4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1c4e0 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1c4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c500 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1c510 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c520 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1c530 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1c550 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75  ur->idx = (lwr+u
1c560 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  pr)/2;.    }.   
1c570 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1c580 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1c590 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1c5a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1c5b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1c5c0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1c5d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1c5e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1c5f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c600 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c610 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c620 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1c640 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1c650 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1c660 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1c670 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1c680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c690 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1c6a0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
1c6b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c6c0 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c6d0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1c6e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c6f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1c700 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1c710 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1c720 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
1c730 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c740 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c750 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
1c760 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c770 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
1c780 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c790 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c7a0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
1c7b0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1c7c0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
1c7d0 74 65 64 20 6f 75 72 20 6f 77 6e 20 75 6e 70 61  ted our own unpa
1c7e0 63 6b 65 64 20 6b 65 79 20 61 74 20 74 68 65 20  cked key at the 
1c7f0 74 6f 70 20 6f 66 20 74 68 69 73 0a 20 20 20 20  top of this.    
1c800 2a 2a 20 70 72 6f 63 65 64 75 72 65 2c 20 74 68  ** procedure, th
1c810 65 6e 20 64 65 73 74 72 6f 79 20 74 68 61 74 20  en destroy that 
1c820 6b 65 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  key before retur
1c830 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ning. */.    sql
1c840 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1c850 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 55 6e  packedRecord(pUn
1c860 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1c870 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c880 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c890 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1c8a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c8b0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1c8c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1c8d0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1c8e0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1c8f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c900 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1c910 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1c920 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1c930 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1c940 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1c950 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1c960 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1c970 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1c980 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1c990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c9a0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1c9b0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1c9c0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1c9d0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1c9e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1c9f0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1ca00 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1ca10 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1ca20 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1ca30 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1ca40 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1ca50 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1ca60 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1ca70 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1ca80 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1ca90 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1caa0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1cab0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1cac0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1cad0 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1cae0 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1caf0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1cb00 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1cb10 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1cb20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cb30 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1cb40 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1cb50 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1cb60 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1cb70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1cb80 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1cb90 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1cba0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1cbb0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1cbc0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1cbd0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1cbe0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1cbf0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1cc00 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1cc10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1cc20 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1cc30 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1cc40 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1cc50 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1cc60 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1cc70 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1cc80 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1cc90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cca0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1ccb0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ccc0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ccd0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1cce0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1ccf0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1cd00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1cd10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1cd20 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1cd30 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1cd40 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43  ->pPage;.  if( C
1cd50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1cd60 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1cd70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1cd80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cd90 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1cda0 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1cdb0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1cdc0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1cdd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cde0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1cdf0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1ce00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1ce10 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1ce20 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  t( pCur->idx<pPa
1ce30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1ce40 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70  pCur->idx++;.  p
1ce50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ce60 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1ce70 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1ce80 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1ce90 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1cea0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1ceb0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1cec0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1ced0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1cee0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1cef0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
1cf00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1cf10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cf20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1cf30 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1cf40 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1cf50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cf60 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
1cf70 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1cf80 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1cf90 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
1cfa0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1cfb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1cfc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1cfd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cfe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1cff0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1d000 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1d010 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1d020 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1d030 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1d040 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1d050 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1d060 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1d070 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1d080 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d090 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1d0a0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1d0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d0d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1d0e0 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1d0f0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1d100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1d110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d120 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1d130 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d150 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1d160 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1d170 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1d180 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1d190 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1d1a0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1d1b0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1d1c0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1d1d0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1d1e0 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1d1f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d200 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d210 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d220 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d230 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d240 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d250 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1d260 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1d270 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1d280 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1d290 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1d2a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d2b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d2c0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1d2d0 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
1d2e0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1d2f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d300 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d310 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1d320 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1d330 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1d340 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d350 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d360 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d370 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d380 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1d390 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d3a0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d3b0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d3c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d3d0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d3e0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d3f0 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
1d400 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1d410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d420 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
1d430 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d440 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
1d450 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c  t4byte( findCell
1d460 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1d470 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  x) );.    rc = m
1d480 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d490 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1d4a0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1d4b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d4c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1d4d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1d4e0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1d4f0 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1d500 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1d510 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1d520 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1d530 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1d540 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1d550 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1d560 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1d570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d590 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1d5a0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1d5b0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1d5c0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1d5d0 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1d5e0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1d5f0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1d600 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d610 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1d620 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1d630 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d650 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1d660 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1d670 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d690 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1d6a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1d6b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1d6c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1d6d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d6e0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1d6f0 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1d700 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1d710 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1d720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d730 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1d740 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1d750 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1d760 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1d770 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1d780 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1d790 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1d7a0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1d7b0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1d7c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d7d0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1d7e0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1d7f0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1d800 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1d810 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1d820 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1d830 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1d840 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1d850 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1d860 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1d870 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1d880 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1d890 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1d8a0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1d8b0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1d8c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1d8d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1d8e0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1d8f0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1d900 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1d910 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1d920 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1d930 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1d940 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1d950 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1d960 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1d970 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1d980 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1d990 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1d9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d9b0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1d9c0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1d9d0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1d9e0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1d9f0 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1da00 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1da10 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1da20 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1da30 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1da40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1da50 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1da60 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1da70 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1da80 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1da90 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1daa0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1dab0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1dac0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1dad0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1dae0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1daf0 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1db00 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1db10 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1db20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1db30 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1db40 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1db50 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1db60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1db70 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1db80 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1db90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dba0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1dbb0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1dbc0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1dbd0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1dbe0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1dbf0 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1dc00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dc10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1dc20 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1dc30 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1dc40 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1dc50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1dc60 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1dc70 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1dc80 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1dc90 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1dca0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1dcb0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1dcc0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1dcd0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1dce0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1dcf0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1dd00 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1dd10 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1dd20 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1dd30 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1dd40 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1dd50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1dd60 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1dd70 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1dd80 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1dd90 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1dda0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1ddb0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1ddc0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1ddd0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1dde0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1ddf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1de00 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1de10 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67  t && nearby<=pag
1de20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1de30 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1de40 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1de50 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
1de60 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1de70 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1de80 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
1de90 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1dea0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
1deb0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1dec0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ded0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1dee0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1def0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
1df00 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
1df10 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
1df20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
1df30 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
1df40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
1df50 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
1df60 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
1df70 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1df80 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
1df90 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
1dfa0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
1dfb0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
1dfc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1dfd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1dfe0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1dff0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1e000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e010 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1e020 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
1e030 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
1e040 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
1e050 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
1e060 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
1e070 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
1e080 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
1e090 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
1e0a0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
1e0b0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
1e0c0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
1e0d0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
1e0e0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1e0f0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
1e100 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
1e110 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1e120 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1e130 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
1e140 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1e150 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
1e160 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e170 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
1e180 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1e190 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e1a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
1e1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1e1c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1e1d0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
1e1e0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
1e1f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1e200 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1e210 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1e220 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e230 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
1e240 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
1e250 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1e260 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
1e270 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
1e280 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
1e290 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
1e2a0 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
1e2b0 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
1e2c0 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
1e2d0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
1e2e0 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
1e2f0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
1e300 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
1e310 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
1e320 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
1e330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e340 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
1e350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e360 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e370 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1e380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1e3a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e3b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1e3c0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1e3d0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
1e3e0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1e3f0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1e400 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1e410 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1e420 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1e430 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1e440 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1e450 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1e460 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1e470 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1e480 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1e490 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42    }else if( k>pB
1e4a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
1e4b0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  - 2 ){.        /
1e4c0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
1e4d0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
1e4e0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1e4f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
1e500 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1e510 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1e520 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e530 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
1e540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e550 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
1e560 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
1e570 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
1e580 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
1e590 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
1e5a0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
1e5b0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
1e5c0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
1e5d0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
1e5e0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
1e5f0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
1e600 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
1e610 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
1e620 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
1e630 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
1e640 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1e650 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1e660 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1e670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e680 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1e690 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e6a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e6b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e6c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e6e0 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
1e6f0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1e700 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e710 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e720 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e730 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1e740 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1e750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e760 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
1e770 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1e780 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e790 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1e7a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e7b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1e7c0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
1e7d0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
1e7e0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
1e7f0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
1e800 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
1e810 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
1e820 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
1e830 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
1e840 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
1e850 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
1e860 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1e870 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
1e880 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
1e890 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1e8a0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
1e8b0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1e8c0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
1e8d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e8e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1e8f0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
1e900 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1e910 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e930 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e940 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e970 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
1e980 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1e990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e9a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e9b0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1e9c0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1e9d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
1e9e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1e9f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1ea00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
1ea10 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1ea20 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1ea30 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1ea40 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1ea50 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
1ea60 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1ea70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1ea80 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1ea90 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
1eaa0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
1eab0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
1eac0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1ead0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1eae0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1eaf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1eb00 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1eb10 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
1eb20 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1eb30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eb40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1eb50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
1eb60 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1eb80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1eb90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1eba0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ebc0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ebd0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1ebe0 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
1ebf0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1ec00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec10 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1ec20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ec30 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1ec40 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1ec50 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1ec60 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
1ec70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ec80 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1ec90 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
1eca0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
1ecb0 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20    int closest;. 
1ecc0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
1ecd0 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
1ece0 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
1ecf0 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
1ed00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ed10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ed20 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1ed30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ed40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1ed50 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ed60 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1ed70 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
1ed80 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
1ed90 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20    int i, dist;. 
1eda0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1edb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1edc0 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
1edd0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
1ede0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
1edf0 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
1ee00 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
1ee10 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
1ee20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1ee30 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
1ee40 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
1ee50 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
1ee60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1ee70 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ee90 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
1eea0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1eeb0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
1eec0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
1eed0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1eee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1eef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ef00 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1ef10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ef20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
1ef30 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
1ef40 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
1ef50 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
1ef60 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
1ef70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
1ef80 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  nt nPage;.      
1ef90 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
1efa0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  ge;.          nP
1efb0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
1efc0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1efd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1efe0 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b   *pPgno>nPage ){
1eff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1f000 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1f010 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1f020 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f040 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f050 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f060 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f080 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1f090 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
1f0a0 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
1f0b0 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
1f0c0 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
1f0d0 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
1f0e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f0f0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
1f100 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
1f110 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
1f120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
1f130 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
1f140 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f150 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
1f160 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
1f170 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
1f180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
1f190 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
1f1a0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1f1b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f1c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1f1d0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1f1e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
1f1f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1f210 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1f220 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65  ollback((*ppPage
1f230 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1f240 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f250 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f260 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1f270 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1f280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f2a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f2b0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
1f2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f2d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
1f2e0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1f2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f300 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f310 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1f320 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1f330 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
1f340 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
1f350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1f360 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
1f370 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1f380 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
1f390 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
1f3a0 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
1f3b0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
1f3c0 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
1f3d0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1f3e0 67 65 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  ger);.    *pPgno
1f3f0 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23   = nPage + 1;..#
1f400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f410 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f420 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
1f430 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  c ){.      /* An
1f440 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73   incr-vacuum has
1f450 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74   already run wit
1f460 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
1f470 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20  tion. So the.   
1f480 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c     ** page to al
1f490 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72  locate is not fr
1f4a0 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  om the physical 
1f4b0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  end of the file,
1f4c0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74   but.      ** at
1f4d0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20   pBt->nTrunc. . 
1f4e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70       */.      *p
1f4f0 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Pgno = pBt->nTru
1f500 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  nc+1;.      if( 
1f510 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
1f520 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f530 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e  {.        (*pPgn
1f540 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o)++;.      }.  
1f550 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1f560 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
1f570 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f580 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
1f590 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
1f5a0 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
1f5b0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
1f5c0 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
1f5d0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
1f5e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1f5f0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
1f600 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
1f610 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
1f620 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
1f630 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
1f640 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
1f650 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
1f660 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
1f670 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
1f680 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1f690 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
1f6a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
1f6b0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1f6c0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1f6d0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1f6e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
1f6f0 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1f700 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
1f710 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
1f720 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
1f730 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
1f740 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1f750 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42  runc ){.      pB
1f760 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67  t->nTrunc = *pPg
1f770 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  no;.    }.#endif
1f780 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
1f790 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1f7a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1f7b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f7c0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1f7d0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1f7e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1f7f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f810 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
1f820 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1f830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1f850 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
1f860 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
1f870 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f880 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1f890 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
1f8a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f8b0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1f8c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f8d0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
1f8e0 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
1f8f0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
1f900 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1f910 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
1f920 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1f930 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  d a page of the 
1f940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f950 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
1f960 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  *.** sqlite3Page
1f970 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20  rUnref() is NOT 
1f980 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65  called for pPage
1f990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f9a0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
1f9b0 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68   *pPage){.  BtSh
1f9c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1f9d0 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  e->pBt;.  MemPag
1f9e0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1f9f0 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  >pPage1;.  int r
1fa00 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50  c, n, k;..  /* P
1fa10 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20  repare the page 
1fa20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  for freeing */. 
1fa30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fa40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1fa50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1fa60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fa70 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
1fa80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
1fa90 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1faa0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
1fab0 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  .  pPage->pParen
1fac0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63  t = 0;..  /* Inc
1fad0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
1fae0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
1faf0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
1fb00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fb10 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1fb20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1fb30 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
1fb40 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1fb50 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
1fb60 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1fb70 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
1fb80 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1fb90 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
1fba0 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
1fbb0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
1fbc0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1fbd0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
1fbe0 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
1fbf0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
1fc00 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
1fc10 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
1fc20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1fc30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fc40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1fc50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1fc60 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  n rc;.  memset(p
1fc70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
1fc80 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
1fc90 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  Size);.#endif..#
1fca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fcb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fcc0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1fcd0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
1fce0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
1fcf0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
1fd00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
1fd10 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1fd20 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
1fd30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  e..  */.  if( pB
1fd40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fd50 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1fd60 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e  Put(pBt, pPage->
1fd70 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45  pgno, PTRMAP_FRE
1fd80 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
1fd90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fda0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
1fdb0 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
1fdc0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
1fdd0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1fde0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1fdf0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1fe00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1fe10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1fe20 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65  rn rc;.    memse
1fe30 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
1fe40 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62  0, 8);.    put4b
1fe50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1fe60 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1fe70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28  gno);.    TRACE(
1fe80 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1fe90 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d  first\n", pPage-
1fea0 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
1feb0 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66  {.    /* Other f
1fec0 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64  ree pages alread
1fed0 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76  y exist.  Retriv
1fee0 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  e the first trun
1fef0 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66  k page.    ** of
1ff00 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
1ff10 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d  d find out how m
1ff20 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61  any leaves it ha
1ff30 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  s. */.    MemPag
1ff40 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72  e *pTrunk;.    r
1ff50 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ff60 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  GetPage(pBt, get
1ff70 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1ff80 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75  Data[32]), &pTru
1ff90 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
1ffa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ffb0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
1ffc0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ffd0 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d  4]);.    if( k>=
1ffe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1fff0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
20000 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66  * The trunk is f
20010 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70  ull.  Turn the p
20020 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
20030 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20  into a new.     
20040 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77   ** trunk page w
20050 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20  ith no leaves.. 
20060 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20070 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
20080 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
20090 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
200a0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
200b0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
200c0 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
200d0 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
200e0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
200f0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
20100 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
20110 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
20120 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
20130 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
20140 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
20150 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
20160 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
20170 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
20180 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
20190 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
201a0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
201b0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
201c0 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
201d0 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
201e0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
201f0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
20200 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
20210 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
20220 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
20230 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72  contain to restr
20240 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
20250 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
20260 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
20270 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
20280 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
20290 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
202a0 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
202b0 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
202c0 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
202d0 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
202e0 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
202f0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
20300 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
20310 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
20320 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
20330 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
20340 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
20350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20360 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
20370 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
203a0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
203b0 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  ata, pTrunk->pgn
203c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  o);.        put4
203d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
203e0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ta[4], 0);.     
203f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20400 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20410 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
20420 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
20430 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
20440 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
20450 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
20460 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
20470 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d  e->pgno, pTrunk-
20480 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
20490 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
204a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
204b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
204c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
204d0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
204e0 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73  ly freed page as
204f0 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63   a leaf on the c
20500 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a  urrent trunk */.
20510 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20520 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
20530 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
20540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20560 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
20570 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b  nk->aData[4], k+
20580 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
20590 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
205a0 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67  ata[8+k*4], pPag
205b0 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
205c0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
205d0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 73  DELETE.        s
205e0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
205f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20600 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  age);.#endif.   
20610 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
20620 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
20630 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
20640 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
20650 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
20660 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
20670 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
20680 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nk);.  }.  retur
20690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
206a0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
206b0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
206c0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
206d0 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
206e0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
206f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
20700 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
20710 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
20720 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
20730 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
20740 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
20750 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
20760 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69    int nOvfl;.  i
20770 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  nt ovflPageSize;
20780 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20790 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
207a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
207b0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
207c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
207d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
207e0 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
207f0 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
20800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20810 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
20820 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
20830 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
20840 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
20850 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
20860 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
20870 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
20880 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
20890 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
208a0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
208b0 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
208c0 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
208d0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
208e0 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
208f0 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
20900 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
20910 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
20920 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d  vfl-- ){.    Mem
20930 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Page *pOvfl;.   
20940 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30   if( ovflPgno==0
20950 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
20960 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
20970 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
20980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20990 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
209a0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65    }..    rc = ge
209b0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
209c0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
209d0 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f  vfl, (nOvfl==0)?
209e0 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  0:&ovflPgno);.  
209f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20a00 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66  n rc;.    rc = f
20a10 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  reePage(pOvfl);.
20a20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20a30 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
20a40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20a50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20a70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20a80 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
20a90 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
20aa0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
20ab0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
20ac0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
20ad0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
20ae0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
20af0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
20b00 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
20b10 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
20b20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
20b30 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
20b40 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
20b50 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
20b60 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
20b70 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
20b80 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
20b90 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
20ba0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
20bb0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
20bc0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
20bd0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
20be0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
20bf0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
20c00 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
20c10 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
20c20 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
20c30 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
20c40 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
20c50 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
20c60 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
20c70 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
20c80 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
20c90 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
20ca0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
20cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
20cc0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
20cd0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
20ce0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
20cf0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
20d00 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
20d10 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
20d20 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
20d30 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
20d40 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
20d50 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
20d60 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
20d70 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
20d80 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
20d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20da0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
20db0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
20dc0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
20dd0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
20de0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20df0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
20e00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
20e10 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
20e20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
20e30 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
20e40 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
20e50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
20e60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
20e70 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
20e80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
20e90 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
20ea0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
20eb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20ec0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20ed0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
20ee0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
20ef0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
20f00 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
20f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20f20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
20f30 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ex) );..  /* Fil
20f40 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
20f50 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
20f60 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
20f70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
20f80 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
20f90 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
20fa0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
20fb0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
20fc0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
20fd0 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
20fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
20ff0 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
21000 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
21010 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
21020 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
21030 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  *)&nKey);.  sqli
21040 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
21050 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
21060 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
21070 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
21080 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
21090 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
210a0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
210b0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
210c0 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a  =nData+nZero );.
210d0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
210e0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
210f0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
21100 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
21110 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
21120 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
21130 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
21140 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
21150 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21160 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    nPayload += nK
21170 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
21180 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
21190 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
211a0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
211b0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
211c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
211d0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
211e0 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
211f0 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
21200 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
21210 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
21220 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
21230 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  aceLeft==0 ){.  
21240 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74 20      int isExact 
21250 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
21260 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21270 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
21280 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
21290 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
212a0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
212b0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
212c0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
212d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
212e0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
212f0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
21300 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
21310 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
21320 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
21330 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
21340 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
21350 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
21360 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
21370 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20   if( pgnoOvfl>1 
21380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21390 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a  isExact = 1; */.
213a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
213b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
213c0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
213d0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
213e0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
213f0 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29  noOvfl, isExact)
21400 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21410 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21420 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
21430 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
21440 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
21450 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
21460 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
21470 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
21480 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
21490 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
214a0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
214b0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
214c0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
214d0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
214e0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
214f0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
21500 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
21510 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
21520 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
21530 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
21540 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
21550 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
21560 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
21570 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
21580 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
21590 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
215a0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
215b0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
215c0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
215d0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
215e0 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
215f0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
21600 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
21610 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21620 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21630 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
21640 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
21650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21660 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
21670 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
21680 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
21690 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
216a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
216b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
216c0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
216d0 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
216e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
216f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
21700 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
21710 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21720 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21730 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
21740 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
21750 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21760 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
21770 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
21780 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
21790 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
217a0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
217b0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
217c0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
217d0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
217e0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
217f0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
21800 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
21810 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
21820 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
21830 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
21840 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
21850 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
21860 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
21870 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
21880 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  eft;.    if( nSr
21890 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
218a0 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
218b0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
218c0 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
218d0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
218e0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
218f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
21900 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
21910 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
21920 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
21930 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
21940 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
21950 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
21960 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
21970 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
21980 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
21990 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
219a0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
219b0 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
219c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
219d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
219e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
219f0 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
21a00 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
21a10 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
21a20 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
21a30 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
21a40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
21a50 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
21a60 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
21a70 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
21a80 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
21a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21aa0 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
21ab0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
21ac0 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
21ad0 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
21ae0 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
21af0 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65  *pThis;.  DbPage
21b00 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
21b10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21b20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
21b30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
21b40 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20  ( pNewParent!=0 
21b50 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
21b60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21b70 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
21b80 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
21b90 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
21ba0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
21bb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
21bc0 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
21bd0 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d  e ){.    pThis =
21be0 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
21bf0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
21c00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
21c10 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74  f( pThis->isInit
21c20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21c30 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
21c40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
21c50 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
21c60 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
21c70 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
21c80 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
21c90 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
21ca0 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
21cb0 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
21cc0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
21cd0 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
21ce0 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
21cf0 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
21d00 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
21d10 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
21d20 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
21d30 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
21d40 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
21d50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21d60 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
21d70 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
21d80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21d90 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
21da0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
21db0 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
21dc0 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
21dd0 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
21de0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
21df0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
21e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21e10 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21e20 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
21e30 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
21e40 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
21e50 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
21e60 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
21e70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
21e80 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
21e90 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
21ea0 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
21eb0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
21ec0 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
21ed0 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
21ee0 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
21ef0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21f00 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
21f10 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
21f20 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
21f30 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
21f40 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
21f50 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
21f60 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
21f70 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   i;.  BtShared *
21f80 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
21f90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21fa0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
21fb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21fc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
21fd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
21fe0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20  ( pPage->leaf ) 
21ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22000 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
22010 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
22020 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
22030 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
22040 67 65 2c 20 69 29 3b 0a 20 20 20 20 72 63 20 3d  ge, i);.    rc =
22050 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
22060 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
22070 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20  l), pPage, i);. 
22080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22090 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
220a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70  ;.  }.  rc = rep
220b0 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
220c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
220d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
220e0 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20  Offset+8]), .   
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 70 50   pPage, i);.  pP
22110 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
22120 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
22130 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
22140 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
22150 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
22160 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
22170 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
22180 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22190 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
221a0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
221b0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
221c0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
221d0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
221e0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
221f0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
22200 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
22210 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
22220 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
22230 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
22240 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
22250 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
22260 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
22270 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
22280 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
22290 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
222a0 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
222b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
222c0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
222d0 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
222e0 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
222f0 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
22300 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
22310 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
22320 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
22330 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
22340 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22350 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
22360 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
22370 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
22380 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
22390 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
223a0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
223b0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
223c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
223d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
223e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
223f0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
22400 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22410 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
22420 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
22430 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
22440 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
22450 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
22460 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
22470 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
22480 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
22490 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
224a0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
224b0 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
224c0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
224d0 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
224e0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
224f0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
22500 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
22510 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
22520 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
22530 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
22540 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
22550 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
22560 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
22570 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
22580 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
22590 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
225a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
225b0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
225c0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
225d0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
225e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
225f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22600 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
22610 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22620 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
22630 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
22640 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
22650 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
22660 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
22670 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
22680 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
22690 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
226a0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
226b0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
226c0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
226d0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
226e0 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
226f0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
22700 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22710 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
22720 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
22730 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
22740 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
22750 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
22760 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
22770 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
22780 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
22790 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
227a0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
227b0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
227c0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
227d0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
227e0 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
227f0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
22800 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
22810 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
22820 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
22830 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
22840 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
22850 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
22860 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
22870 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
22880 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
22890 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
228a0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
228b0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
228c0 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
228d0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
228e0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
228f0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
22900 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
22910 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
22920 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
22930 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
22940 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
22950 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
22960 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
22970 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
22980 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
22990 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
229a0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
229b0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
229c0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
229d0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
229e0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
229f0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
22a00 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
22a10 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
22a20 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
22a30 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
22a40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
22a50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
22a60 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
22a70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
22a80 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22a90 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
22aa0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22ab0 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
22ac0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
22ad0 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
22ae0 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
22af0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
22b00 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
22b10 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
22b20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
22b30 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
22b40 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
22b50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22b60 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
22b70 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
22b80 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
22b90 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22ba0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
22bb0 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
22bc0 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
22bd0 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
22be0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
22bf0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
22c00 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
22c10 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22c20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
22c30 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
22c40 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
22c50 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
22c60 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
22c70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
22c80 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
22c90 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
22ca0 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
22cb0 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
22cc0 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
22cd0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
22ce0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
22cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22d00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22d10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22d20 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
22d30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
22d40 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
22d50 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
22d60 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
22d70 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
22d80 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
22d90 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
22da0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
22db0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
22dc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
22dd0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a     assert( j<siz
22de0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
22df0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
22e00 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  aOvfl[0]) );.   
22e10 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
22e20 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
22e30 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
22e40 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20  [j].idx = i;.   
22e50 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
22e60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22e70 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
22e80 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
22e90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22eb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
22ec0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
22ed0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
22ee0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
22ef0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
22f00 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
22f10 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
22f20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
22f30 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
22f40 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
22f50 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
22f60 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
22f70 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
22f80 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
22f90 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
22fa0 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
22fb0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
22fc0 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
22fd0 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
22fe0 20 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50       defragmentP
22ff0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
23000 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
23010 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
23020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
23030 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b  d + sz <= top );
23040 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d  .    }.    idx =
23050 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23060 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61  Page, sz);.    a
23070 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a  ssert( idx>0 );.
23080 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
23090 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74  <= get2byte(&dat
230a0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20  a[hdr+5]) );.   
230b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
230c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
230d0 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63  e -= 2;.    memc
230e0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
230f0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
23100 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
23110 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74   for(j=end-2, pt
23120 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
23130 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
23140 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
23150 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
23160 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
23170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
23180 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
23190 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
231a0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
231b0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
231c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
231d0 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65  hift = 1;.#ifnde
231e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
231f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
23200 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
23210 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
23220 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
23230 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
23240 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
23250 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
23260 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
23270 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
23280 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
23290 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
232a0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
232b0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
232c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
232d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
232e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
232f0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  info);.      ass
23300 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
23310 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
23320 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
23330 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
23340 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
23350 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
23360 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
23370 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
23380 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
23390 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
233a0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
233b0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
233c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
233d0 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ut(pPage->pBt, p
233e0 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
233f0 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
23400 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
23410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23420 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
23430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
23440 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
23450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23460 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
23470 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
23480 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
23490 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
234a0 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
234b0 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
234c0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
234d0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
234e0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
234f0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
23500 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
23510 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
23520 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
23530 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
23540 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
23550 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
23560 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
23570 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
23580 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
23590 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
235a0 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
235b0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
235c0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
235d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
235e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
235f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74  ter */.  int tot
23600 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f  alSize;    /* To
23610 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  tal size of all 
23620 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68  cells */.  int h
23630 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
23640 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65  Index of page he
23650 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
23660 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41  llptr;      /* A
23670 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
23680 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
23690 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
236a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
236b0 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
236c0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
236d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
236e0 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a  or the page */..
236f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23700 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
23710 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23720 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23730 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23740 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20   );.  totalSize 
23750 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
23760 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
23770 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20     totalSize += 
23780 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20  aSize[i];.  }.  
23790 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a  assert( totalSiz
237a0 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  e+2*nCell<=pPage
237b0 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73  ->nFree );.  ass
237c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
237d0 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74  l==0 );.  cellpt
237e0 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r = pPage->cellO
237f0 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
23800 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
23810 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
23820 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79  Offset;.  put2by
23830 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
23840 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e   nCell);.  if( n
23850 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c  Cell ){.    cell
23860 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53  body = allocateS
23870 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61  pace(pPage, tota
23880 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65  lSize);.    asse
23890 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29  rt( cellbody>0 )
238a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
238b0 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a  age->nFree >= 2*
238c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61  nCell );.    pPa
238d0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e  ge->nFree -= 2*n
238e0 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cell;.    for(i=
238f0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
23900 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  {.      put2byte
23910 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c  (&data[cellptr],
23920 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
23930 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
23940 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
23950 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
23960 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d        cellptr +=
23970 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f   2;.      cellbo
23980 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy += aSize[i];.
23990 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
239a0 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67  ( cellbody==pPag
239b0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
239c0 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ze );.  }.  pPag
239d0 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  e->nCell = nCell
239e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
239f0 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
23a00 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
23a10 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
23a20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
23a30 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
23a40 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
23a50 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
23a60 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
23a70 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
23a80 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
23a90 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
23aa0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
23ab0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
23ac0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
23ad0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
23ae0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
23af0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
23b00 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
23b10 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
23b20 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
23b30 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
23b40 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
23b50 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
23b60 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
23b70 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
23b80 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
23b90 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
23ba0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
23bb0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
23bc0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
23bd0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
23be0 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
23bf0 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
23c00 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
23c10 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
23c20 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
23c30 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
23c40 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
23c50 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
23c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23c70 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
23c80 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
23c90 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
23ca0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
23cb0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
23cc0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
23cd0 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  ance */../* Forw
23ce0 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
23cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23d00 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e  nce(MemPage*, in
23d10 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
23d20 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
23d30 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
23d40 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
23d50 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
23d60 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
23d70 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
23d80 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
23d90 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
23da0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
23db0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
23dc0 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
23dd0 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
23de0 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
23df0 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
23e00 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
23e10 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
23e20 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62  tead of trying b
23e30 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
23e40 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
23e50 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
23e60 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
23e70 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
23e80 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
23e90 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
23ea0 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
23eb0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
23ec0 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
23ed0 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
23ee0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
23ef0 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
23f00 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
23f10 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
23f20 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
23f30 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
23f40 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
23f50 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
23f60 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
23f70 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
23f80 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
23f90 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
23fa0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
23fb0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
23fc0 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
23fd0 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
23fe0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
23ff0 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
24000 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
24010 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
24020 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
24030 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
24040 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
24050 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
24060 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a  pPage, MemPage *
24070 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20  pParent){.  int 
24080 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
24090 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  New;.  Pgno pgno
240a0 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
240b0 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a  ;.  u16 szCell;.
240c0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
240d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
240e0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
240f0 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
24100 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
24110 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
24120 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
24130 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
24140 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
24150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24160 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
24170 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
24180 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241a0 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
241b0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
241c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
241d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
241e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
241f0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  tex) );..  /* Al
24200 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
24210 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
24220 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
24230 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
24240 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
24250 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
24260 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
24270 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
24280 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
24290 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
242a0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
242b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
242c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
242d0 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50    }.  pCell = pP
242e0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
242f0 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  ell;.  szCell = 
24300 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
24310 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72  e, pCell);.  zer
24320 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
24330 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
24340 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
24350 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
24360 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  zCell);.  pPage-
24370 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
24380 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61  .  /* Set the pa
24390 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c  rent of the newl
243a0 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
243b0 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a   to pParent. */.
243c0 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20    pNew->pParent 
243d0 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  = pParent;.  sql
243e0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
243f0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
24400 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63  .  /* pPage is c
24410 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67  urrently the rig
24420 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72  ht-child of pPar
24430 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73  ent. Change this
24440 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
24450 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73  e right-child is
24460 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c   the new page al
24470 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e  located above an
24480 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20  d.  ** pPage is 
24490 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68  the next-to-righ
244a0 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2a 0a 20  t child. .  **. 
244b0 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
244c0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
244d0 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
244e0 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
244f0 65 6c 6c 28 29 0a 20 20 2a 2a 20 6d 61 79 20 6f  ell().  ** may o
24500 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72  nly return other
24510 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
24520 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72 65  if it is require
24530 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  d to allocate.  
24540 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ** one or more o
24550 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53  verflow pages. S
24560 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c  ince an internal
24570 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65   table B-Tree ce
24580 6c 6c 20 0a 20 20 2a 2a 20 6d 61 79 20 6e 65 76  ll .  ** may nev
24590 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e  er spill over on
245a0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
245b0 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78  age (it is a max
245c0 69 6d 75 6d 20 6f 66 20 0a 20 20 2a 2a 20 31 33  imum of .  ** 13
245d0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c   bytes in size),
245e0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65   it is not necce
245f0 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74  ssary to check t
24600 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  he return code..
24610 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61    **.  ** Simila
24620 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43  rly, the insertC
24630 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63  ell() function c
24640 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68  annot fail if th
24650 65 20 70 61 67 65 0a 20 20 2a 2a 20 62 65 69 6e  e page.  ** bein
24660 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  g inserted into 
24670 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 61  is already writa
24680 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ble and the cell
24690 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 2a 2a 20   does not .  ** 
246a0 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
246b0 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
246c0 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
246d0 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 2a  rn code too..  *
246e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
246f0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
24700 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
24710 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
24720 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74  Cell-1);.  sqlit
24730 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
24740 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
24750 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 66 69 6c 6c  , &info);.  fill
24760 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
24770 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69  parentCell, 0, i
24780 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
24790 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
247a0 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
247b0 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 61 73  tSize<64 );.  as
247c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
247d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
247e0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
247f0 29 3b 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  );.  insertCell(
24800 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
24810 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
24820 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
24830 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 66 69  );.  put4byte(fi
24840 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
24850 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
24860 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
24870 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
24880 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
24890 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
248a0 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
248b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
248c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
248d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
248e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
248f0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
24900 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
24910 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
24920 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
24930 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
24940 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
24950 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
24960 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
24970 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
24980 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
249a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
249b0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
249c0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
249d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
249e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
249f0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
24a00 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
24a10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
24a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24a30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
24a40 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
24a50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24a60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
24a70 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
24a80 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
24a90 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  page and balance
24aa0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
24ab0 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  ,.  ** in case t
24ac0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
24ad0 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
24ae0 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
24af0 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  rfull..  */.  re
24b00 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
24b10 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63  .  return balanc
24b20 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d  e(pParent, 0);.}
24b30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24b40 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
24b50 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
24b60 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
24b70 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
24b80 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
24b90 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
24ba0 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
24bb0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
24bc0 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
24bd0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
24be0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
24bf0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
24c00 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
24c10 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
24c20 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
24c30 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
24c40 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
24c50 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
24c60 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
24c70 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
24c80 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
24c90 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
24ca0 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
24cb0 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
24cc0 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
24cd0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
24ce0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
24cf0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
24d00 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
24d10 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
24d20 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
24d30 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
24d40 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
24d50 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
24d60 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
24d70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
24d80 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
24d90 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
24da0 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
24db0 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
24dc0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
24dd0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
24de0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
24df0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
24e00 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
24e10 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
24e20 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
24e30 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
24e40 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
24e50 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
24e60 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
24e70 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
24e80 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
24e90 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
24ea0 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
24eb0 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
24ec0 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
24ed0 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
24ee0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
24ef0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
24f00 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
24f10 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
24f20 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
24f30 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
24f40 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
24f50 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
24f60 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
24f70 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
24f80 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
24f90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24fa0 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
24fb0 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
24fc0 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
24fd0 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
24fe0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
24ff0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
25000 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
25010 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
25020 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
25030 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
25040 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
25050 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
25060 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
25070 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25080 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
25090 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
250a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
250b0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
250c0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
250d0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
250e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
250f0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
25100 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
25110 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
25120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
25130 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
25140 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
25150 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
25160 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  nroot(MemPage *p
25170 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
25180 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
25190 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
251a0 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ent of pPage */.
251b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
251d0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
251e0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
251f0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
25200 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25210 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
25220 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
25230 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
25240 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
25250 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
25260 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
25270 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
25280 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
25290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
252a0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
252b0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
252c0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
252d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
252e0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
252f0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
25300 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
25310 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25320 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
25330 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
25340 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
25350 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
25360 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
25370 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
25380 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25390 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
253a0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
253b0 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
253e0 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
253f0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
25400 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25420 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
25430 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
25440 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
25450 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
25460 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
25470 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
25480 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
25490 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
254a0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
254b0 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
254c0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
254d0 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
254e0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
254f0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
25500 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
25510 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
25520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
25530 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
25540 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
25550 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
25560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
25570 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
25580 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
25590 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
255a0 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
255b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
255c0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
255d0 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
255e0 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20   iSpace2 = 0;   
255f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25600 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
25610 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20  f aSpace2[] */. 
25620 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20   int szScratch; 
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25640 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68   Size of scratch
25650 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65   memory requeste
25660 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
25670 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
25680 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
25690 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
256a0 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
256b0 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
256c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
256d0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
256e0 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
256f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
25700 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
25710 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
25720 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
25730 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
25740 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
25750 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
25760 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
25770 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
25780 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
25790 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
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 4e 65 77 5b 5d 20  page in apNew[] 
257d0 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
257e0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
257f0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
25800 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
25810 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
25820 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
25830 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
25840 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
25850 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
25860 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
25870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25880 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
25890 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
258a0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
258b0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258d0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
258e0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
258f0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
25900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
25910 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
25920 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
25930 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
25940 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
25950 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69   Space for holdi
25960 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70  ng data of apCop
25970 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  y[] */.  u8 *aSp
25980 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
25990 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70  /* Space for cop
259a0 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
259b0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c  cells before bal
259c0 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ance */.  u8 *aS
259d0 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
259e0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76   /* Space for ov
259f0 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20  erflow dividers 
25a00 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61  cells after bala
25a10 6e 63 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nce */.#ifndef S
25a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25a30 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f  ACUUM.  u8 *aFro
25a40 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  m = 0;.#endif.. 
25a50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25a60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25a70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25a80 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  ;..  /* .  ** Fi
25a90 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
25aa0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
25ab0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
25ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25ad0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
25ae0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
25af0 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
25b00 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
25b10 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
25b20 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
25b30 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
25b40 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
25b50 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  t );.  if( SQLIT
25b60 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
25b70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
25b80 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29  arent->pDbPage))
25b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
25ba0 63 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28  c;.  }..  TRACE(
25bb0 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
25bc0 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
25bd0 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
25be0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
25bf0 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gno));..#ifndef 
25c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
25c10 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20  KBALANCE.  /*.  
25c20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73  ** A special cas
25c30 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74  e:  If a new ent
25c40 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ry has just been
25c50 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
25c60 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61  .  ** table (tha
25c70 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69  t is, a btree wi
25c80 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  th integer keys 
25c90 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20  and all data at 
25ca0 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a  the leaves).  **
25cb0 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74   and the new ent
25cc0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ry is the right-
25cd0 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  most entry in th
25ce0 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74  e tree (it has t
25cf0 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  he.  ** largest 
25d00 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68  key) then use th
25d10 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63  e special balanc
25d20 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e  e_quick() routin
25d30 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e  e for.  ** balan
25d40 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71  cing.  balance_q
25d50 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66  uick() is much f
25d60 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74  aster and result
25d70 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20  s in a tighter. 
25d80 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64   ** packing of d
25d90 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ata in the commo
25da0 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  n case..  */.  i
25db0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26  f( pPage->leaf &
25dc0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  &.      pPage->i
25dd0 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70  ntKey &&.      p
25de0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
25df0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  &.      pPage->n
25e00 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20  Overflow==1 &&. 
25e10 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66       pPage->aOvf
25e20 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
25e30 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20  >nCell &&.      
25e40 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
25e50 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20  pgno!=1 &&.     
25e60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
25e70 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
25e80 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
25e90 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20  ==pPage->pgno.  
25ea0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
25eb0 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
25ec0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65   siblings to the
25ed0 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20   left of pPage. 
25ee0 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20  It may be that. 
25ef0 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e     ** they are n
25f00 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e  ot full and no n
25f10 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69  ew page is requi
25f20 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
25f30 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71  return balance_q
25f40 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72  uick(pPage, pPar
25f50 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ent);.  }.#endif
25f60 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
25f70 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
25f80 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
25f90 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
25fa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25fb0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
25fc0 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
25fd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
25fe0 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
25ff0 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
26000 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
26010 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
26020 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
26030 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
26040 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
26050 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
26060 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
26070 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
26080 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
26090 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64   if( pParent->id
260a0 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67  xShift ){.    Pg
260b0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e  no pgno;.    pgn
260c0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
260d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
260e0 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
260f0 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
26100 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
26110 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c   for(idx=0; idx<
26120 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
26130 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  idx++){.      if
26140 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
26150 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78  ell(pParent, idx
26160 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ))==pgno ){.    
26170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26180 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
26190 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74  ert( idx<pParent
261a0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
261b0 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65       || get4byte
261c0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
261d0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
261e0 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b  set+8])==pgno );
261f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
26200 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  x = pPage->idxPa
26210 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rent;.  }..  /*.
26220 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
26230 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
26240 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
26250 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
26260 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
26270 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
26280 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
26290 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
262a0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
262b0 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
262c0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Page);..  /*.  *
262d0 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
262e0 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
262f0 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
26300 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
26310 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
26320 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
26330 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
26340 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
26350 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
26360 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
26370 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
26380 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
26390 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
263a0 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
263b0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
263c0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
263d0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
263e0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
263f0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
26400 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
26410 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
26420 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
26430 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
26440 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
26450 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
26460 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
26470 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
26480 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
26490 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
264a0 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
264b0 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
264c0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
264d0 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
264e0 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
264f0 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
26500 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
26510 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
26520 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
26530 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
26540 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
26550 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
26560 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
26570 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
26580 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
26590 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
265a0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
265b0 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
265c0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
265d0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
265e0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
265f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
26600 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
26610 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
26620 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
26630 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50  ], &apOld[i], pP
26640 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
26650 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
26660 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
26670 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
26680 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f  nt = k;.    apCo
26690 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
266a0 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
266b0 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
266c0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
266d0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
266e0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
266f0 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
26700 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
26710 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
26720 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
26730 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
26740 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
26750 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
26760 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
26770 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
26780 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
26790 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
267a0 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20   */.  szScratch 
267b0 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
267c0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
267f0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
26800 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26820 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
26830 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
26840 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
26850 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
26860 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
26870 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
26880 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
268b0 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
268c0 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
268d0 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20  ls : 0);        
268e0 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
268f0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
26900 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
26910 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
26920 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
26930 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
26940 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
26950 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26960 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
26970 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
26980 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
26990 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
269a0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
269b0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
269c0 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
269d0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
269e0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
269f0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
26a00 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
26a10 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
26a20 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
26a30 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
26a40 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
26a50 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
26a60 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26a70 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
26a80 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
26a90 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
26aa0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
26ab0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
26ac0 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
26ad0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
26ae0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
26af0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
26b00 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43  pace1 - (u8*)apC
26b10 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
26b20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
26b30 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
26b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26b50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
26b60 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
26b70 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f  cuum ){.    aFro
26b80 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74  m = &aSpace1[pBt
26b90 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
26ba0 0a 23 65 6e 64 69 66 0a 20 20 61 53 70 61 63 65  .#endif.  aSpace
26bb0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  2 = sqlite3PageM
26bc0 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53  alloc(pBt->pageS
26bd0 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61  ize);.  if( aSpa
26be0 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ce2==0 ){.    rc
26bf0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26c00 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
26c10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
26c20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
26c30 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
26c40 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
26c50 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
26c60 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
26c70 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
26c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
26c90 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
26ca0 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
26cb0 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
26cc0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
26cd0 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
26ce0 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
26cf0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
26d00 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
26d10 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
26d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
26d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
26d40 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
26d50 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61  i] = (MemPage*)a
26d60 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d  Copy[i];.    mem
26d70 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c  cpy(p, apOld[i],
26d80 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
26d90 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  );.    p->aData 
26da0 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a  = (void*)&p[1];.
26db0 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44      memcpy(p->aD
26dc0 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
26dd0 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
26de0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize);.  }..  /*.
26df0 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
26e00 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
26e10 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
26e20 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
26e30 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
26e40 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
26e50 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
26e60 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
26e70 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
26e80 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
26e90 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63  ained form aSpac
26ea0 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
26eb0 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20  the the divider 
26ec0 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  Cells.  ** from 
26ed0 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
26ee0 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
26ef0 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
26f00 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
26f10 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
26f20 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
26f30 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
26f40 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
26f50 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
26f60 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
26f70 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20  into aSpace1[]. 
26f80 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
26f90 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
26fa0 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
26fb0 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
26fc0 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
26fd0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
26fe0 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
26ff0 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
27000 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
27010 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
27020 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
27030 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
27040 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
27050 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
27060 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
27070 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
27080 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
27090 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
270a0 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
270b0 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
270c0 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
270d0 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
270e0 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
270f0 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
27100 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
27110 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
27120 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
27130 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e  fData && pPage->
27140 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  leaf;.  for(i=0;
27150 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
27160 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
27170 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
27180 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
27190 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
271a0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
271b0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
271c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
271d0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
271e0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
271f0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
27200 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
27210 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
27220 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
27230 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
27240 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
27250 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27260 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
27270 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
27280 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
27290 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
272a0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
272b0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
272c0 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
272d0 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
272e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
272f0 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
27300 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
27310 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
27320 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27330 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
27340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27360 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
27370 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
27380 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
27390 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36  d-1 ){.      u16
273a0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
273b0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
273c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
273d0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
273e0 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20      /* With the 
273f0 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70  LEAFDATA flag, p
27400 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c  Parent cells hol
27410 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74  d only INTKEYs t
27420 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
27430 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
27440 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69   keys on the chi
27450 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65  ld pages.  We ne
27460 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20  ed to remove.   
27470 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69       ** the divi
27480 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  der cells from p
27490 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20  Parent, but the 
274a0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
274b0 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  re not.        *
274c0 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c  * added to apCel
274d0 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79  l[] because they
274e0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
274f0 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a  of child cells..
27500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27510 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
27520 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
27530 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27540 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
27550 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27560 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
27570 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
27580 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
27590 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
275a0 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
275b0 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
275c0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
275d0 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
275e0 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
275f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27600 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70   iSpace1<=pBt->p
27610 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
27620 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
27630 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
27640 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
27650 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
27660 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69  afCorrection;.#i
27670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27680 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27690 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
276a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
276b0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
276c0 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
276d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
276e0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
276f0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
27700 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
27710 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
27720 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
27730 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
27740 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
27750 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
27760 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
27770 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
27780 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
27790 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
277a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
277b0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
277c0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
277d0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
277e0 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
277f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
27800 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
27810 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
27820 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
27830 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
27840 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
27850 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
27860 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
27870 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
27880 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
27890 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
278a0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
278b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
278c0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
278d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
278e0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
278f0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
27900 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
27910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27920 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
27930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27940 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
27950 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
27960 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
27970 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
27980 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
27990 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
279a0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
279b0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
279c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
279d0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
279e0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
279f0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
27a00 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
27a10 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
27a20 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
27a30 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
27a40 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
27a50 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
27a60 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
27a70 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
27a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
27a90 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
27aa0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
27ab0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
27ac0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
27ad0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
27ae0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
27af0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
27b00 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
27b10 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
27b20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
27b30 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
27b40 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
27b50 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
27b60 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
27b70 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
27b80 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
27b90 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
27ba0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
27bb0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
27bc0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
27bd0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
27be0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
27bf0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
27c00 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
27c10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27c20 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
27c30 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
27c40 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
27c50 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
27c60 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
27c70 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
27c80 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
27c90 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
27ca0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
27cb0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
27cc0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
27cd0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
27ce0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
27cf0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
27d00 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
27d10 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
27d20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
27d30 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
27d40 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
27d50 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
27d60 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
27d70 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
27d80 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
27d90 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
27da0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
27db0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
27dc0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
27dd0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
27de0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
27df0 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
27e00 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
27e10 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
27e20 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
27e30 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
27e40 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
27e50 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
27e60 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
27e70 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
27e80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
27e90 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
27ea0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
27eb0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
27ec0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
27ed0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
27ee0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
27ef0 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
27f00 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
27f10 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
27f20 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
27f30 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
27f40 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
27f50 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
27f60 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
27f70 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
27f80 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
27f90 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
27fa0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
27fb0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
27fc0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
27fd0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
27fe0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
27ff0 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
28000 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
28010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28020 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
28030 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
28040 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
28050 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
28060 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
28070 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
28080 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
28090 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
280a0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
280b0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
280c0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
280d0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
280e0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
280f0 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
28100 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
28110 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
28120 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
28130 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
28140 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
28150 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
28160 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
28170 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
28180 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
28190 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
281a0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
281b0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
281c0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
281d0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
281e0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
281f0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
28200 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
28210 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
28220 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
28230 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
28240 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
28250 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
28260 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
28270 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28280 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
28290 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
282a0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
282b0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
282c0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
282d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
282e0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
282f0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
28300 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
28310 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
28320 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
28330 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
28340 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
28350 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
28360 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28370 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
28380 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
28390 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
283a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
283b0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
283c0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
283d0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
283e0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
283f0 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
28400 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
28410 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
28420 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
28430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28440 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
28450 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28460 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
28470 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28480 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
284a0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
284b0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
284c0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
284d0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
284e0 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
284f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
28500 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
28510 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
28520 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
28530 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
28540 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61      }.    zeroPa
28550 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
28560 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  gs);.  }..  /* F
28570 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
28580 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
28590 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
285a0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
285b0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
285c0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
285d0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
285e0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
285f0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28600 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
28610 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
28620 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
28630 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
28640 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
28650 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
28660 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
28670 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
28680 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
28690 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
286a0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
286b0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
286c0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
286d0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
286e0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
286f0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
28700 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
28710 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
28720 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
28730 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
28740 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
28750 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
28760 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
28770 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
28780 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
28790 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
287a0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
287b0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
287c0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
287d0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
287e0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
287f0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
28800 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
28810 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
28820 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
28830 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
28840 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
28850 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
28860 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
28870 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
28880 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
28890 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
288a0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
288b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
288c0 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e  ( pgnoNew[j]<(un
288d0 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
288e0 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
288f0 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
28900 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20  pgnoNew[j];.    
28910 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
28920 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
28930 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
28940 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
28950 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d    t = pgnoNew[i]
28960 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
28970 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ew[i];.      pgn
28980 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65  oNew[i] = pgnoNe
28990 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
289a0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
289b0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e  minI];.      pgn
289c0 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a  oNew[minI] = t;.
289d0 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
289e0 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
289f0 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  }.  TRACE(("BALA
28a00 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
28a10 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20  %d  new: %d(%d) 
28a20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
28a30 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
28a40 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20      pgnoOld[0], 
28a50 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70  .    nOld>=2 ? p
28a60 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20  gnoOld[1] : 0,. 
28a70 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e     nOld>=3 ? pgn
28a80 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  oOld[2] : 0,.   
28a90 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e   pgnoNew[0], szN
28aa0 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
28ab0 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20  =2 ? pgnoNew[1] 
28ac0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
28ad0 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
28ae0 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e   nNew>=3 ? pgnoN
28af0 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[2] : 0, nNew>
28b00 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
28b10 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
28b20 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c   pgnoNew[3] : 0,
28b30 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
28b40 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
28b50 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34  w>=5 ? pgnoNew[4
28b60 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  ] : 0, nNew>=5 ?
28b70 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
28b80 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
28b90 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
28ba0 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
28bb0 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
28bc0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
28bd0 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
28be0 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
28bf0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
28c00 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
28c10 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
28c20 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
28c30 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
28c40 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
28c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
28c60 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
28c70 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
28c80 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
28c90 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70  t( pNew->pgno==p
28ca0 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20  gnoNew[i] );.   
28cb0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
28cc0 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20  pageFlags);.    
28cd0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
28ce0 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
28cf0 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
28d00 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
28d10 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
28d20 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
28d30 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
28d40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28d50 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
28d60 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 );..#ifndef SQ
28d70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28d80 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74  CUUM.    /* If t
28d90 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
28da0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
28db0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
28dc0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er map entries. 
28dd0 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74     ** that point
28de0 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73   to the siblings
28df0 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72   that were rearr
28e00 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e  anged. These can
28e10 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a   be: left.    **
28e20 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c   children of cel
28e30 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68  ls, the right-ch
28e40 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c  ild of the page,
28e50 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
28e60 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  es.    ** pointe
28e70 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20  d to by cells.. 
28e80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
28e90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
28ea0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
28eb0 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
28ec0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
28ed0 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
28ee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
28ef0 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
28f00 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
28f10 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
28f20 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
28f30 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
28f40 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
28f50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28f70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
28f80 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28fb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
28fc0 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
28fd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
28fe0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
28ff0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
29000 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
29010 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
29020 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
29030 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
29040 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
29050 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e    */.    if( i<n
29060 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c  New-1 && j<nCell
29070 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
29080 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
29090 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
290a0 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
290b0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
290c0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
290d0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
290e0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
290f0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
29100 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
29110 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32  &aSpace2[iSpace2
29120 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
29130 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
29140 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
29150 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
29160 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
29170 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
29180 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
29190 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
291a0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
291b0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
291c0 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
291d0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
291e0 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
291f0 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
29200 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
29210 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
29220 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
29230 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
29240 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
29250 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
29260 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
29270 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
29280 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
29290 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
292a0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
292b0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
292c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
292d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
292e0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
292f0 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
29300 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
29310 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49  p;.        fillI
29320 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
29330 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
29340 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a  ey, 0, 0, 0, &sz
29350 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
29360 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
29370 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
29380 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
29390 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
293a0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
293b0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
293c0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
293d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
293e0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
293f0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
29400 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
29410 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
29420 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
29430 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
29440 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
29450 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
29460 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74  * (see sqlite3Bt
29470 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
29480 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
29490 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
294a0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
294b0 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
294c0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
294d0 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
294e0 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
294f0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
29500 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
29510 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
29520 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29530 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
29540 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
29550 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
29560 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
29570 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
29580 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
29590 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
295a0 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
295b0 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
295c0 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
295d0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
295e0 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
295f0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
29600 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
29610 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
29620 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
29630 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
29640 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
29650 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
29660 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
29670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29680 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20       iSpace2 += 
29690 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
296a0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
296b0 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
296c0 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d  ssert( iSpace2<=
296d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
296e0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
296f0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
29700 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
29710 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
29720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29730 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
29740 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
29750 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
29760 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
29770 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
29780 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
29790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
297a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
297b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
297c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
297d0 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
297e0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
297f0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
29800 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
29810 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
29820 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
29830 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
29840 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
29850 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
29860 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
29870 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29880 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
29890 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
298a0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
298b0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
298c0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
298d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
298e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
298f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
29900 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29920 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
29930 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
29940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
29950 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
29960 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
29970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
29980 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
29990 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
299a0 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
299b0 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
299c0 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
299d0 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
299e0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
299f0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
29a00 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
29a10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
29a20 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
29a30 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
29a40 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
29a50 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
29a60 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
29a70 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
29a80 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
29a90 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
29aa0 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
29ab0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
29ac0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
29ad0 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
29ae0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
29af0 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
29b00 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
29b10 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
29b20 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
29b30 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
29b40 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
29b50 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
29b60 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
29b70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
29b80 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
29b90 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
29ba0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
29bb0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
29bc0 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
29bd0 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
29be0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29bf0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
29c00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29c10 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
29c20 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
29c30 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
29c40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
29c50 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29c60 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
29c70 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
29c80 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
29c90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29ca0 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
29cb0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
29cc0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
29cd0 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
29ce0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
29cf0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
29d00 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
29d10 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
29d20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
29d30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
29d40 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
29d50 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
29d60 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
29d70 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20    apCell = 0;.  
29d80 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
29d90 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
29da0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
29db0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
29dc0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
29dd0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
29de0 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32  PageFree(aSpace2
29df0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
29e00 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
29e10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
29e20 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
29e30 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
29e40 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
29e50 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
29e60 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
29e70 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
29e80 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
29e90 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
29ea0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
29eb0 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
29ec0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
29ed0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
29ee0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
29ef0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
29f00 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
29f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29f20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29f30 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
29f40 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
29f50 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
29f60 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
29f70 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
29f80 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
29f90 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
29fa0 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
29fb0 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
29fc0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
29fd0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
29fe0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
29ff0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2a000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a010 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
2a020 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
2a030 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a050 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
2a060 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
2a070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a090 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
2a0a0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
2a0b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
2a0e0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
2a0f0 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
2a100 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
2a110 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
2a120 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
2a130 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2a140 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2a150 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2a160 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
2a170 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2a180 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a1a0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2a1b0 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
2a1c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
2a1d0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
2a1e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2a1f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2a200 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a210 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a220 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
2a230 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2a240 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
2a250 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
2a260 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2a270 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c  e3Malloc( mxCell
2a280 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
2a290 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29  u8*)+sizeof(u16)
2a2a0 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
2a2b0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2a2c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
2a2d0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2a2e0 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
2a2f0 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
2a300 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
2a310 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
2a320 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
2a330 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
2a340 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
2a350 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
2a360 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
2a370 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
2a380 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
2a390 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
2a3a0 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
2a3b0 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2a3c0 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
2a3d0 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
2a3e0 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
2a3f0 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
2a400 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
2a410 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
2a420 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
2a430 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2a440 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2a450 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
2a460 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
2a470 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
2a480 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
2a490 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
2a4a0 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
2a4b0 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
2a4c0 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
2a4d0 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
2a4e0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
2a4f0 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
2a500 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
2a510 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2a520 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2a530 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
2a540 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
2a550 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
2a560 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
2a570 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
2a580 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
2a590 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
2a5a0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
2a5b0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
2a5c0 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
2a5d0 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
2a5e0 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
2a5f0 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
2a600 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
2a610 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2a620 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a630 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a640 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
2a650 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
2a660 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a670 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72  pgnoChild<=pager
2a680 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
2a690 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b  >pBt->pPager) );
2a6a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a6b0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
2a6c0 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
2a6d0 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
2a6e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2a6f0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2a700 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
2a710 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
2a720 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2a730 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2a740 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
2a750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2a760 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2a770 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2a780 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2a790 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2a7a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
2a7b0 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
2a7c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2a7d0 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
2a7e0 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
2a7f0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
2a800 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
2a810 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
2a820 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2a830 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2a840 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
2a850 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
2a860 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
2a870 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2a880 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
2a890 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
2a8a0 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
2a8b0 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
2a8c0 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
2a8d0 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
2a8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2a8f0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
2a900 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
2a910 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
2a920 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
2a930 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
2a940 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
2a950 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
2a960 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34   */.        put4
2a970 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a980 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a990 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20  set+8], .       
2a9a0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
2a9b0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68  Child->aData[pCh
2a9c0 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ild->hdrOffset+8
2a9d0 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ]));.        fre
2a9e0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2a9f0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2aa00 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2aa10 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
2aa20 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
2aa30 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
2aa40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2aa50 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
2aa60 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
2aa70 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
2aa80 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
2aa90 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
2aaa0 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
2aab0 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
2aac0 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
2aad0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2aae0 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
2aaf0 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
2ab00 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2ab10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ab20 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
2ab30 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
2ab40 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
2ab50 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2ab60 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
2ab70 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
2ab80 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
2ab90 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ent = 0;.      r
2aba0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2abb0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
2abc0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
2abd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2abe0 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
2abf0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2ac00 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2ac10 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
2ac20 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
2ac30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ac40 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
2ac50 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2ac60 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
2ac70 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
2ac80 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
2ac90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2aca0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
2acb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2acc0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2acd0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2ace0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
2acf0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
2ad00 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
2ad10 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
2ad20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2ad30 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
2ad40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ad50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ad70 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2ad80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ad90 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2ada0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2adb0 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
2adc0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2add0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2ade0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
2adf0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2ae00 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
2ae10 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
2ae20 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
2ae30 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
2ae40 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
2ae50 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
2ae60 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
2ae70 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
2ae80 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
2ae90 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
2aea0 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
2aeb0 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
2aec0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
2aed0 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
2aee0 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
2aef0 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
2af00 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
2af10 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
2af20 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
2af30 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
2af40 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
2af50 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
2af60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2af70 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
2af80 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2af90 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2afa0 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
2afb0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
2afc0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
2afd0 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
2afe0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2aff0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
2b000 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
2b010 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
2b020 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
2b030 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
2b040 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
2b050 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
2b060 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
2b070 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
2b080 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
2b090 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
2b0a0 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
2b0b0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2b0c0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
2b0d0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2b0f0 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
2b100 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
2b110 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
2b120 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2b130 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
2b140 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
2b150 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
2b160 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2b170 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b180 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b190 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  >0 );.  pBt = pP
2b1a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
2b1b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b1c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2b1d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c  x) );.  rc = all
2b1e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2b1f0 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67  Bt, &pChild, &pg
2b200 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e  noChild, pPage->
2b210 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
2b220 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b230 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b240 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b250 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
2b260 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  e) );.  usableSi
2b270 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2b280 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70  Size;.  data = p
2b290 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
2b2a0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2b2b0 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67  ffset;.  brk = g
2b2c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2b2d0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
2b2e0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
2b2f0 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
2b300 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
2b310 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
2b320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
2b330 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
2b340 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62  ta[brk], &data[b
2b350 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d  rk], usableSize-
2b360 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 43 68 69  brk);.  if( pChi
2b370 6c 64 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74  ld->isInit ) ret
2b380 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b390 50 54 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  PT;.  rc = sqlit
2b3a0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2b3b0 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
2b3c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b3d0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2b3e0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
2b3f0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
2b400 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
2b410 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
2b420 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
2b430 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
2b440 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
2b450 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
2b460 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
2b470 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
2b480 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
2b490 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
2b4a0 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
2b4b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
2b4c0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
2b4d0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
2b4e0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
2b4f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2b500 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2b510 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
2b520 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
2b530 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
2b540 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
2b550 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
2b560 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
2b570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b580 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2b590 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2b5a0 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
2b5b0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
2b5c0 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
2b5d0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2b5e0 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
2b5f0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2b600 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
2b610 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
2b620 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
2b630 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2b640 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2b650 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
2b660 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2b670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b680 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2b690 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20  edeeper_out;.   
2b6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
2b6b0 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c  endif.  rc = bal
2b6c0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68  ance_nonroot(pCh
2b6d0 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65  ild);..balancede
2b6e0 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  eper_out:.  rele
2b6f0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2b700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b710 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66  ./*.** Decide if
2b720 20 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20   the page pPage 
2b730 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
2b740 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63  nced.  If balanc
2b750 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72  ing is.** requir
2b760 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70  ed, call the app
2b770 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
2b780 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  ng routine..*/.s
2b790 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2b7a0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
2b7b0 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20  , int insert){. 
2b7c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b7d0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73  _OK;.  assert( s
2b7e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b7f0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b800 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
2b810 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
2b820 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2b830 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2b840 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2b850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b860 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2b870 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
2b880 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2b890 5f 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a  _deeper(pPage);.
2b8a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b8b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b8c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2b8d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2b8e0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
2b8f0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
2b900 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2b910 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2b920 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69   || .        (!i
2b930 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e  nsert && pPage->
2b940 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74  nFree>pPage->pBt
2b950 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2b960 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b970 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2b980 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2b990 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b9a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2b9b0 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20  tine checks all 
2b9c0 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69  cursors that poi
2b9d0 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f  nt to table pgno
2b9e0 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  Root..** If any 
2b9f0 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73  of those cursors
2ba00 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74   were opened wit
2ba10 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61  h wrFlag==0 in a
2ba20 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61   different.** da
2ba30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2ba40 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f  n (a database co
2ba50 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nnection that sh
2ba60 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a  ares the pager.*
2ba70 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65  * cache with the
2ba80 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74   current connect
2ba90 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74  ion) and that ot
2baa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  her connection .
2bab0 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ** is not in the
2bac0 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65   ReadUncommmitte
2bad0 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  d state, then th
2bae0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2baf0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f  ns .** SQLITE_LO
2bb00 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77  CKED..**.** As w
2bb10 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77  ell as cursors w
2bb20 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63  ith wrFlag==0, c
2bb30 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c  ursors with wrFl
2bb40 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73  ag==1 and .** is
2bb50 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d  IncrblobHandle==
2bb60 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69  1 are also consi
2bb70 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72  dered 'read' cur
2bb80 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61  sors. Incrementa
2bb90 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f  l .** blob curso
2bba0 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
2bbb0 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
2bbc0 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
2bbd0 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73  When pgnoRoot is
2bbe0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2bbf0 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
2bc00 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
2bc10 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70   is also.** resp
2bc20 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61  onsible for inva
2bc30 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65  lidating increme
2bc40 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2bc50 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  s when the table
2bc60 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68   row.** on which
2bc70 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64   they are opened
2bc80 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d   is deleted or m
2bc90 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73  odified. Cursors
2bca0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2bcb0 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .** according to
2bcc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
2bcd0 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ules:.**.**   1)
2bce0 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72   When BtreeClear
2bcf0 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  Table() is calle
2bd00 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d to completely 
2bd10 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  delete the conte
2bd20 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61  nts.**      of a
2bd30 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70   B-Tree table, p
2bd40 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2bd50 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d  o zero and param
2bd60 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a  eter iRow is .**
2bd70 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e        set to non
2bd80 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
2bd90 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  ase all incremen
2bda0 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
2bdb0 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e   open.**      on
2bdc0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2bdd0 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72  d at pgnoRoot ar
2bde0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2bdf0 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42  *.**   2) When B
2be00 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74  treeInsert(), Bt
2be10 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
2be20 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73  treePutData() is
2be30 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20   called to .**  
2be40 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62      modify a tab
2be50 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51  le row via an SQ
2be60 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78  L statement, pEx
2be70 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2be80 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69  the .**      wri
2be90 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74  te cursor used t
2bea0 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63  o do the modific
2beb0 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65  ation and parame
2bec0 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a  ter iRow is set.
2bed0 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  **      to the i
2bee0 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66  nteger row id of
2bef0 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72   the B-Tree entr
2bf00 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  y being modified
2bf10 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20  . Unless.**     
2bf20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73   pExclude is its
2bf30 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  elf an increment
2bf40 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20  al blob cursor, 
2bf50 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65  then all increme
2bf60 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f  ntal.**      blo
2bf70 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
2bf80 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68  n row iRow of th
2bf90 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76  e B-Tree are inv
2bfa0 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  alidated..**.** 
2bfb0 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78    3) If both pEx
2bfc0 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61  clude and iRow a
2bfd0 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20  re set to zero, 
2bfe0 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  no incremental b
2bff0 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  lob .**      cur
2c000 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
2c010 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
2c020 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
2c030 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ks(.  Btree *pBt
2c040 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e  ree, .  Pgno pgn
2c050 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73  oRoot, .  BtCurs
2c060 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20  or *pExclude,.  
2c070 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74  i64 iRow.){.  Bt
2c080 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2c090 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2c0a0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2c0b0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2c0c0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
2c0d0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2c0e0 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
2c0f0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2c100 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2c110 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
2c120 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f  p==pExclude ) co
2c130 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c140 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
2c150 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
2c160 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c170 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2c180 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
2c190 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20  blobHandle && ( 
2c1a0 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78 63  .         (!pExc
2c1b0 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20  lude && iRow).  
2c1c0 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65      || (pExclude
2c1d0 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69   && !pExclude->i
2c1e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
2c1f0 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  && p->info.nKey=
2c200 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20  =iRow).    )){. 
2c210 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
2c220 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2c230 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2c240 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21    if( p->eState!
2c250 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2c260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c270 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a  ( p->wrFlag==0 .
2c280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c290 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2c2a0 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c    || p->isIncrbl
2c2b0 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a  obHandle.#endif.
2c2c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
2c2d0 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2c2e0 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  p->pBtree->db;. 
2c2f0 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
2c300 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
2c310 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20  (dbOther!=db && 
2c320 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
2c330 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
2c340 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b  ommitted)==0) ){
2c350 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c360 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2c370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c380 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c390 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
2c3a0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
2c3b0 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
2c3c0 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
2c3d0 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
2c3e0 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
2c3f0 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
2c400 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
2c410 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
2c420 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
2c430 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
2c440 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
2c450 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
2c460 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
2c470 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
2c480 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
2c490 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
2c4a0 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
2c4b0 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
2c4c0 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
2c4d0 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
2c4e0 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
2c4f0 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
2c500 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
2c510 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
2c520 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  both ignored..*/
2c530 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c540 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
2c550 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2c560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2c570 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
2c580 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
2c590 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
2c5a0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2c5b0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2c5c0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
2c5d0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
2c5e0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
2c5f0 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
2c600 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
2c610 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
2c620 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c640 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
2c650 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
2c660 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
2c670 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20  int appendBias  
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c690 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c6a0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
2c6b0 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nd */.){.  int r
2c6c0 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20  c;.  int loc;.  
2c6d0 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d  int szNew;.  Mem
2c6e0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
2c6f0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
2c700 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
2c710 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c720 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2c730 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
2c740 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
2c750 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Cell = 0;..  ass
2c760 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2c770 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2c780 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2c790 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2c7a0 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2c7b0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2c7c0 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
2c7d0 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a  oing an insert *
2c7e0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2c7f0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2c800 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2c810 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2c820 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2c830 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2c840 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2c850 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2c860 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c870 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75  TE_PERM;   /* Cu
2c880 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f  rsor not open fo
2c890 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2c8a0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2c8b0 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72  Locks(pCur->pBtr
2c8c0 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
2c8d0 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 20  ot, pCur, nKey) 
2c8e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c8f0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
2c900 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
2c910 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
2c920 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
2c930 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2c940 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2c950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2c960 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a  Cur->skip;.  }..
2c970 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
2c980 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2c990 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
2c9a0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2c9b0 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  */.  clearCursor
2c9c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2c9d0 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
2c9e0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2c9f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2ca00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2ca10 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
2ca20 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2ca30 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2ca40 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 30 2c  o(pCur, pKey, 0,
2ca50 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
2ca60 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20  s, &loc)).  ){. 
2ca70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ca80 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2ca90 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2caa0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2cab0 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
2cac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cad0 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d  >leaf || !pPage-
2cae0 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54  >leafData );.  T
2caf0 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
2cb00 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
2cb10 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
2cb20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
2cb30 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2cb40 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
2cb50 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
2cb60 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
2cb70 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
2cb80 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
2cb90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2cba0 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
2cbb0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
2cbc0 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
2cbd0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
2cbe0 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
2cbf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cc00 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
2cc10 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
2cc20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
2cc30 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
2cc40 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
2cc50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2cc60 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2cc70 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
2cc80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2cc90 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
2cca0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
2ccb0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2ccc0 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
2ccd0 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2cce0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2ccf0 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
2cd00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2cd10 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
2cd20 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
2cd30 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
2cd40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2cd50 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2cd60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2cd70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
2cd80 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
2cd90 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
2cda0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2cdb0 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
2cdc0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2cdd0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2cde0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2cdf0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2ce00 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2ce10 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2ce20 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2ce30 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2ce40 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2ce50 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2ce60 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2ce70 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2ce80 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2ce90 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2cea0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2ceb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2cec0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2ced0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2cee0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2cef0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
2cf00 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
2cf10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2cf20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2cf30 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
2cf40 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2cf50 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
2cf60 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
2cf70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2cf80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2cf90 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
2cfa0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2cfb0 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
2cfc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cfd0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2cfe0 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2cff0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2d000 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2d010 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2d020 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2d030 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2d040 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2d050 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2d060 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2d070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d080 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2d090 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2d0a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2d0b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2d0c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2d0d0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2d0e0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2d0f0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2d100 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2d110 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d120 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2d130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2d140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2d150 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2d160 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2d170 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2d180 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2d190 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2d1a0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2d1b0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2d1c0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2d1d0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2d1e0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2d1f0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2d200 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2d210 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d220 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2d230 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2d240 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2d250 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2d260 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2d270 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2d280 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2d290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d2a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2d2b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2d2c0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2d2d0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2d2e0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2d2f0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2d300 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2d310 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2d320 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2d330 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2d340 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2d350 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2d360 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2d370 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
2d380 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  fo.nKey) ){.    
2d390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d3a0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2d3b0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2d3c0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2d3d0 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2d3e0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2d3f0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2d400 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2d410 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2d420 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2d430 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2d440 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2d450 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2d460 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2d470 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2d480 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2d490 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2d4a0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2d4b0 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2d4c0 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2d4d0 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2d4e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2d4f0 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f    (rc = restoreO
2d500 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2d510 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c  tion(pCur))!=0 |
2d520 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65  |.    (rc = save
2d530 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2d540 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2d550 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20  pCur))!=0 ||.   
2d560 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2d570 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d580 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29  pDbPage))!=0.  )
2d590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2d5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
2d5b0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  e the cell withi
2d5c0 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c  n its page and l
2d5d0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
2d5e0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
2d5f0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
2d600 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
2d610 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2d620 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2d630 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
2d640 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
2d650 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
2d660 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c  ct..  */.  pCell
2d670 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2d680 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2d690 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d6a0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
2d6b0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
2d6c0 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
2d6d0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2d6e0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
2d6f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2d700 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
2d710 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d720 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2d730 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2d740 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2d750 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2d760 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2d770 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2d780 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2d790 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2d7a0 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2d7b0 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2d7c0 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2d7d0 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2d7e0 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2d7f0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2d800 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2d810 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2d820 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2d830 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2d840 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2d850 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2d860 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2d870 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2d880 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d890 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f  Next;.    int no
2d8a0 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67  tUsed;.    unsig
2d8b0 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65  ned char *tempCe
2d8c0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ll = 0;.    asse
2d8d0 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  rt( !pPage->leaf
2d8e0 44 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  Data );.    sqli
2d8f0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
2d900 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
2d910 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
2d920 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d930 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2d940 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2d950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d970 33 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66  3PagerWrite(leaf
2d980 43 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61  Cur.pPage->pDbPa
2d990 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2d9a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d9b0 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
2d9c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
2d9d0 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2d9e0 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
2d9f0 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
2da00 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
2da10 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
2da20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2da30 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66  Page->pgno, leaf
2da40 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29  Cur.pPage->pgno)
2da50 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  );.      dropCel
2da60 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2da70 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2da80 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2da90 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69        pNext = fi
2daa0 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  ndCell(leafCur.p
2dab0 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2dac0 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74  x);.      szNext
2dad0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c   = cellSizePtr(l
2dae0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e  eafCur.pPage, pN
2daf0 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
2db00 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
2db10 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
2db20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74  );.      allocat
2db30 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2db40 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20  .      tempCell 
2db50 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
2db60 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
2db70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2db80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2db90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2dba0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dbc0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2dbd0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2dbe0 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65  x, pNext-4, szNe
2dbf0 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20  xt+4, tempCell, 
2dc00 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2dc10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dc20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2dc30 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2dc40 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
2dc50 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f  pCur->idx), pgno
2dc60 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2dc70 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2dc80 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ge, 0);.      }.
2dc90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dcb0 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66     dropCell(leaf
2dcc0 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2dcd0 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b  ur.idx, szNext);
2dce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
2dcf0 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50  lance(leafCur.pP
2dd00 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  age, 0);.      }
2dd10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2dd20 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
2dd30 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
2dd40 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2dd50 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2dd60 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2dd70 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2dd80 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
2dd90 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2dda0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70  pgno));.    drop
2ddb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2ddc0 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2ddd0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2dde0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  );.    rc = bala
2ddf0 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2de00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2de10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2de20 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2de30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2de40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2de50 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
2de60 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
2de70 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
2de80 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
2de90 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2dea0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
2deb0 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
2dec0 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
2ded0 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
2dee0 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
2def0 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
2df00 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
2df10 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
2df20 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
2df30 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
2df40 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
2df50 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
2df60 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
2df70 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
2df80 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
2df90 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
2dfa0 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
2dfb0 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
2dfc0 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
2dfd0 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
2dfe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2dff0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2e000 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2e010 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2e020 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2e030 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
2e040 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2e050 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
2e060 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2e070 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2e080 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2e090 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2e0a0 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2e0b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2e0c0 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2e0d0 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2e0e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2e0f0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2e100 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2e110 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2e120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2e130 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2e140 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
2e150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2e160 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2e170 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2e180 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2e190 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2e1a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2e1b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e1c0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2e1d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2e1e0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2e1f0 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2e200 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2e210 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2e220 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2e230 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e240 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2e250 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2e260 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
2e270 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
2e280 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
2e290 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
2e2a0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
2e2b0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
2e2c0 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
2e2d0 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
2e2e0 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
2e2f0 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
2e300 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
2e310 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
2e320 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
2e330 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
2e340 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
2e350 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
2e360 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
2e370 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2e380 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
2e390 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
2e3a0 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
2e3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2e3c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
2e3d0 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
2e3e0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2e3f0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
2e400 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
2e410 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2e420 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2e430 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
2e440 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
2e450 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
2e460 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2e470 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2e480 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
2e490 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2e4a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e4b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e4c0 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
2e4d0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2e4e0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2e4f0 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2e500 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2e510 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2e520 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2e530 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2e540 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e  /.    while( pgn
2e550 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
2e560 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
2e570 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
2e580 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
2e590 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2e5a0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
2e5b0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
2e5c0 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
2e5d0 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
2e5e0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
2e5f0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
2e600 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
2e610 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
2e620 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
2e630 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2e640 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
2e650 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2e660 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
2e670 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
2e680 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
2e690 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2e6a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2e6b0 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
2e6c0 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
2e6d0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
2e6e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e6f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e700 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
2e710 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
2e720 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
2e730 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
2e740 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
2e750 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
2e760 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
2e770 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
2e780 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
2e790 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
2e7a0 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
2e7b0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2e7c0 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
2e7d0 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
2e7e0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
2e7f0 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
2e800 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
2e810 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
2e820 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
2e830 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
2e840 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
2e850 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
2e860 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
2e870 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
2e880 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
2e890 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e8a0 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
2e8b0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2e8c0 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
2e8d0 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
2e8e0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
2e8f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2e900 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
2e910 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
2e920 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e940 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e950 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2e960 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2e970 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
2e980 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
2e990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e9a0 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
2e9b0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2e9c0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2e9d0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2e9e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e9f0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2ea00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ea10 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2ea20 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
2ea30 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
2ea40 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
2ea50 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2ea60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2ea70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ea80 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2ea90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2eaa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eab0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2eac0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2ead0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eae0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72    }.      rc = r
2eaf0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
2eb00 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
2eb10 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
2eb20 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2eb30 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
2eb40 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
2eb50 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
2eb60 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
2eb70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eb80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2eb90 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2eba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ebb0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ebc0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2ebd0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2ebe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ebf0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ec00 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2ec10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ec20 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2ec30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ec40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ec50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2ec60 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2ec70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ec80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2ec90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
2eca0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
2ecb0 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
2ecc0 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
2ecd0 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
2ece0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
2ecf0 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
2ed00 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
2ed10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2ed20 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
2ed30 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
2ed40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ed50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2ed60 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2ed70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2ed80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ed90 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
2eda0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
2edb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2edc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2edd0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2ede0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2edf0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2ee00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2ee10 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2ee20 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2ee30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2ee40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2ee50 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
2ee60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ee70 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
2ee80 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
2ee90 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2eea0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2eeb0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2eec0 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
2eed0 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
2eee0 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
2eef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ef00 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2ef10 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
2ef20 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2ef30 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2ef40 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
2ef50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2ef60 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
2ef70 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
2ef80 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
2ef90 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
2efa0 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
2efb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2efc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2efd0 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
2efe0 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
2eff0 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
2f000 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
2f010 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
2f020 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2f030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2f040 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2f050 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2f070 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
2f080 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
2f090 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f0b0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
2f0c0 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
2f0d0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
2f0e0 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
2f0f0 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
2f100 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
2f110 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
2f120 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
2f130 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2f140 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2f150 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
2f160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f170 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
2f180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f190 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2f1a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2f1b0 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
2f1c0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2f1d0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2f1e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f1f0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
2f200 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2f210 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
2f220 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2f230 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2f240 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2f250 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
2f260 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2f270 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
2f280 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2f290 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
2f2a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f2b0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2f2c0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2f2d0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2f2e0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2f2f0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
2f300 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2f310 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2f320 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2f330 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2f340 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
2f350 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2f360 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2f370 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2f380 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2f390 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2f3a0 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2f3b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2f3c0 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
2f3d0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
2f3e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2f3f0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2f400 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
2f410 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
2f420 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2f430 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
2f440 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2f450 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2f460 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
2f470 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
2f480 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
2f490 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
2f4a0 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
2f4b0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
2f4c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2f4d0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2f4e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2f4f0 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
2f500 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
2f510 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2f520 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
2f530 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
2f540 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
2f550 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
2f560 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
2f570 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
2f580 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2f590 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
2f5a0 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
2f5b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2f5c0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2f5d0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2f5e0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2f5f0 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
2f600 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
2f610 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
2f620 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
2f630 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
2f640 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
2f650 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2f660 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
2f670 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2f680 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
2f690 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f6a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2f6b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
2f6c0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
2f6d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2f6e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2f6f0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2f700 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2f710 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2f720 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
2f730 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65  f( (rc = checkRe
2f740 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
2f750 65 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54  e, 0, 1))!=SQLIT
2f760 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  E_OK ){.    /* n
2f770 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
2f780 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
2f790 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2f7a0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2f7b0 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a   iTable, 0)) ){.
2f7c0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
2f7d0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o do */.  }else{
2f7e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2f7f0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2f800 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
2f810 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
2f820 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2f830 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f840 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
2f850 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
2f860 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
2f870 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2f880 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
2f890 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
2f8a0 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
2f8b0 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
2f8c0 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
2f8d0 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
2f8e0 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
2f8f0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
2f900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
2f910 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
2f920 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
2f930 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
2f940 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
2f950 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2f960 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
2f970 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
2f980 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
2f990 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
2f9a0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
2f9b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f9c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
2f9d0 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
2f9e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f9f0 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
2fa00 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
2fa10 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
2fa20 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
2fa30 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
2fa40 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
2fa50 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
2fa60 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
2fa70 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2fa80 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
2fa90 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
2faa0 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
2fab0 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
2fac0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2fad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fae0 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
2faf0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
2fb00 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
2fb10 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
2fb20 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
2fb30 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2fb40 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
2fb50 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2fb60 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
2fb70 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
2fb80 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
2fb90 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
2fba0 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
2fbb0 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
2fbc0 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
2fbd0 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
2fbe0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
2fbf0 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
2fc00 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
2fc10 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
2fc20 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54  c int btreeDropT
2fc30 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2fc40 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
2fc50 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
2fc60 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2fc70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68  Page = 0;.  BtSh
2fc80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2fc90 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
2fca0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2fcb0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2fcc0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
2fcd0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2fce0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2fcf0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2fd00 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2fd10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2fd20 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2fd30 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
2fd40 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
2fd50 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
2fd60 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
2fd70 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
2fd80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2fd90 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
2fda0 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
2fdb0 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
2fdc0 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
2fdd0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2fde0 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
2fdf0 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
2fe00 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
2fe10 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
2fe20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
2fe30 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
2fe40 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
2fe50 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
2fe60 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2fe70 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2fe80 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2fe90 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2fea0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  e, &pPage, 0);. 
2feb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2fec0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
2fed0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2fee0 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20  le(p, iTable);. 
2fef0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2ff00 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2ff10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2ff20 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
2ff30 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
2ff40 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
2ff50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ff60 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
2ff70 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2ff80 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2ff90 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
2ffa0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2ffb0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2ffc0 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
2ffd0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
2ffe0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2fff0 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74  a(p, 4, &maxRoot
30000 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
30010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30020 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
30030 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30040 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30050 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30060 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
30070 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
30080 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
30090 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
300a0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
300b0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
300c0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
300d0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
300e0 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
300f0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
30100 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
30110 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30120 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
30130 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30140 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30150 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
30160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30180 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30190 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
301a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
301b0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
301c0 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
301d0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
301e0 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
301f0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
30200 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
30210 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
30220 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
30230 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
30240 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
30250 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
30260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
30270 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
30280 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30290 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
302a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
302b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
302c0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
302d0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
302e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
302f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
30320 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
30330 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d  pBt, pMove, PTRM
30340 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
30350 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
30360 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
30370 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
30380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30390 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
303a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
303b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
303c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
303d0 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
303e0 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
303f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30430 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
30440 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
30450 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
30460 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
30470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30490 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
304a0 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76  }.        *piMov
304b0 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ed = maxRootPgno
304c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
304d0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20   /* Set the new 
304e0 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20  'max-root-page' 
304f0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74  value in the dat
30500 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54 68  abase header. Th
30510 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
30520 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73  he old value les
30530 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20  s one, less one 
30540 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70  more if that hap
30550 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  pens to.      **
30560 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   be a root-page 
30570 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65  number, less one
30580 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69   again if that i
30590 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50  s the.      ** P
305a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
305b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
305c0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
305d0 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
305e0 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  tPgno==PENDING_B
305f0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
30600 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
30610 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
30620 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
30630 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41  tPgno==PTRMAP_PA
30640 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f  GENO(pBt, maxRoo
30650 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  tPgno) ){.      
30660 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
30670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
30680 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67  ssert( maxRootPg
30690 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
306a0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20  _PAGE(pBt) );.. 
306b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
306c0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
306d0 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67  (p, 4, maxRootPg
306e0 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  no);.    }else{.
306f0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
30700 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30710 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30720 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
30730 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
30740 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72  /* If sqlite3Btr
30750 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20  eeDropTable was 
30760 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
30770 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67  . */.    zeroPag
30780 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54  e(pPage, PTF_INT
30790 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a  KEY|PTF_LEAF );.
307a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
307b0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
307c0 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
307d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
307e0 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
307f0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
30800 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
30810 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
30820 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
30830 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
30840 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
30850 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61  DropTable(p, iTa
30860 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20  ble, piMoved);. 
30870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
30880 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
30890 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
308a0 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
308b0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
308c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
308d0 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
308e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
308f0 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
30900 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30910 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
30920 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
30930 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
30940 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
30950 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
30960 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
30970 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
30980 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
30990 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
309a0 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
309b0 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
309c0 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
309d0 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
309e0 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
309f0 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
30a00 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
30a10 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
30a20 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
30a30 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
30a40 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
30a50 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
30a60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
30a70 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
30a80 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
30a90 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  eta){.  DbPage *
30aa0 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  pDbPage;.  int r
30ab0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
30ac0 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
30ad0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
30ae0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
30af0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
30b00 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  t->db = p->db;..
30b10 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d    /* Reading a m
30b20 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72  eta-data value r
30b30 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  equires a read-l
30b40 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61  ock on page 1 (a
30b50 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68  nd hence.  ** th
30b60 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
30b70 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74  table. We grab t
30b80 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c  his lock regardl
30b90 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
30ba0 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53  r.  ** not the S
30bb0 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
30bc0 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
30bd0 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  t (the table roo
30be0 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a  ted at page.  **
30bf0 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73   1 is treated as
30c00 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
30c10 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  by queryTableLoc
30c20 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c  k() and lockTabl
30c30 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  e())..  */.  rc 
30c40 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
30c50 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
30c60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
30c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
30c80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
30c90 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  p);.    return r
30ca0 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
30cb0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
30cc0 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  =15 );.  rc = sq
30cd0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
30ce0 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70  t->pPager, 1, &p
30cf0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
30d00 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
30d10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30d20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30d30 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67  }.  pP1 = (unsig
30d40 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
30d50 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
30d60 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74  DbPage);.  *pMet
30d70 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  a = get4byte(&pP
30d80 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a  1[36 + idx*4]);.
30d90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
30da0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ref(pDbPage);.. 
30db0 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
30dc0 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
30dd0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
30de0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
30df0 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
30e00 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
30e10 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
30e20 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
30e30 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
30e40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
30e50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30e60 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
30e70 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
30e80 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
30e90 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
30ea0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
30eb0 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
30ec0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31  = lockTable(p, 1
30ed0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
30ee0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
30ef0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
30f00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
30f10 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
30f20 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  on back into the
30f30 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
30f40 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f  [0] is.** read-o
30f50 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20  nly and may not 
30f60 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69  be written..*/.i
30f70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55  nt sqlite3BtreeU
30f80 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20  pdateMeta(Btree 
30f90 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
30fa0 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61   iMeta){.  BtSha
30fb0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
30fc0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
30fd0 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72  ar *pP1;.  int r
30fe0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  c;.  assert( idx
30ff0 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=1 && idx<=15 )
31000 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
31010 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
31020 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
31030 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
31040 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
31050 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
31060 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
31070 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
31080 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
31090 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
310a0 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20  >pPage1!=0 );.  
310b0 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
310c0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
310d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
310e0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
310f0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
31100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74  _OK ){.      put
31120 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
31130 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a  idx*4], iMeta);.
31140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31150 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31160 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20       if( idx==7 
31170 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
31180 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
31190 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29  um || iMeta==0 )
311a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
311b0 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d  ( iMeta==0 || iM
311c0 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  eta==1 );.      
311d0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
311e0 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20  m = iMeta;.     
311f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
31200 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
31210 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
31220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31230 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61  * Return the fla
31240 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65  g byte at the be
31250 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
31260 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72  age that the cur
31270 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  sor.** is curren
31280 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
31290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
312a0 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73  treeFlags(BtCurs
312b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
312c0 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74  TODO: What about
312d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
312e0 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61  EEK state? Proba
312f0 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  bly need to call
31300 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43  .  ** restoreOrC
31310 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
31320 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  on() here..  */.
31330 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31340 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ;.  restoreOrCle
31350 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
31360 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
31370 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
31380 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
31390 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
313a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
313b0 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
313c0 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
313d0 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44  Page ? pPage->aD
313e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
313f0 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f  fset] : 0;.}.../
31400 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
31410 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
31420 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
31430 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
31440 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
31450 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
31460 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
31470 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
31480 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ger(Btree *p){. 
31490 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
314a0 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64  pPager;.}..#ifnd
314b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
314c0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
314d0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65  *.** Append a me
314e0 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72  ssage to the err
314f0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
31500 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
31510 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  d checkAppendMsg
31520 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
31530 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20  *pCheck,.  char 
31540 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zMsg1,.  const 
31550 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20  char *zFormat,. 
31560 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73   ....){.  va_lis
31570 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68  t ap;.  if( !pCh
31580 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74  eck->mxErr ) ret
31590 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d  urn;.  pCheck->m
315a0 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b  xErr--;.  pCheck
315b0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73  ->nErr++;.  va_s
315c0 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
315d0 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
315e0 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b  >errMsg.nChar ){
315f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
31600 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65  ccumAppend(&pChe
31610 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22  ck->errMsg, "\n"
31620 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
31630 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c  zMsg1 ){.    sql
31640 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
31650 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  nd(&pCheck->errM
31660 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a  sg, zMsg1, -1);.
31670 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50    }.  sqlite3VXP
31680 72 69 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65  rintf(&pCheck->e
31690 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61  rrMsg, 1, zForma
316a0 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
316b0 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  (ap);.}.#endif /
316c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
316d0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
316e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
316f0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
31700 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CHECK./*.** Add 
31710 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  1 to the referen
31720 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
31730 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69  e iPage.  If thi
31740 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  s is the second.
31750 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
31760 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e  the page, add an
31770 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
31780 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  o pCheck->zErrMs
31790 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  g..** Return 1 i
317a0 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72  f there are 2 or
317b0 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65  e more reference
317c0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  s to the page an
317d0 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69  d 0 if.** if thi
317e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
317f0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
31800 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  page..**.** Also
31810 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
31820 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69  page number is i
31830 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61  n bounds..*/.sta
31840 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66  tic int checkRef
31850 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43  (IntegrityCk *pC
31860 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c  heck, int iPage,
31870 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29   char *zContext)
31880 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  {.  if( iPage==0
31890 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
318a0 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d  f( iPage>pCheck-
318b0 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c  >nPage || iPage<
318c0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
318d0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
318e0 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c  zContext, "inval
318f0 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25  id page number %
31900 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
31910 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
31920 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65  if( pCheck->anRe
31930 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20  f[iPage]==1 ){. 
31940 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31950 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31960 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e  xt, "2nd referen
31970 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20  ce to page %d", 
31980 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
31990 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
319a0 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52  rn  (pCheck->anR
319b0 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a  ef[iPage]++)>1;.
319c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
319d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
319e0 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  M./*.** Check th
319f0 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  at the entry in 
31a00 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
31a10 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20  for page iChild 
31a20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65  maps to .** page
31a30 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65   iParent, pointe
31a40 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20  r type ptrType. 
31a50 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61  If not, append a
31a60 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
31a70 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f  ** to pCheck..*/
31a80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
31a90 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65  ckPtrmap(.  Inte
31aa0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
31ab0 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20     /* Integrity 
31ac0 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f  check context */
31ad0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
31ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
31af0 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ld page number *
31b00 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
31b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
31b20 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
31b30 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e  ap type */.  Pgn
31b40 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20  o iParent,      
31b50 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
31b60 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65  pointer map pare
31b70 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  nt page number *
31b80 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
31b90 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  xt         /* Co
31ba0 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f  ntext descriptio
31bb0 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f  n (used for erro
31bc0 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69  r msg) */.){.  i
31bd0 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72  nt rc;.  u8 ePtr
31be0 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20  mapType;.  Pgno 
31bf0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a  iPtrmapParent;..
31c00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
31c10 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43  (pCheck->pBt, iC
31c20 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79  hild, &ePtrmapTy
31c30 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65  pe, &iPtrmapPare
31c40 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
31c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31c60 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31c70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31c80 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
31c90 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
31ca0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
31cb0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
31cc0 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
31cd0 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
31ce0 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
31cf0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31d00 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31d10 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
31d20 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
31d30 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
31d40 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
31d50 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
31d60 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
31d70 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
31d80 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
31d90 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
31da0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
31db0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
31dc0 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
31dd0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
31de0 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
31df0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
31e00 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
31e10 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
31e20 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
31e30 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
31e40 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
31e50 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
31e60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
31e70 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
31e80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
31e90 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
31ea0 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
31eb0 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
31ec0 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
31ed0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31ee0 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
31ef0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
31f00 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
31f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31f20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
31f30 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
31f40 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
31f50 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
31f60 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
31f70 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
31f80 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
31f90 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
31fa0 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
31fb0 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
31fc0 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63  N-- > 0 && pChec
31fd0 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20  k->mxErr ){.    
31fe0 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67  DbPage *pOvflPag
31ff0 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
32000 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b  char *pOvflData;
32010 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31  .    if( iPage<1
32020 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
32030 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32040 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
32050 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61      "%d of %d pa
32060 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  ges missing from
32070 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73   overflow list s
32080 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a  tarting at %d",.
32090 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65            N+1, e
320a0 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29  xpected, iFirst)
320b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
320c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
320d0 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
320e0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29  age, zContext) )
320f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
32100 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
32110 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20  pCheck->pPager, 
32120 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f  (Pgno)iPage, &pO
32130 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20  vflPage) ){.    
32140 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32150 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32160 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65  t, "failed to ge
32170 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  t page %d", iPag
32180 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
32190 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c  .    }.    pOvfl
321a0 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
321b0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
321c0 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66  agerGetData(pOvf
321d0 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  lPage);.    if( 
321e0 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  isFreeList ){.  
321f0 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34      int n = get4
32200 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
32210 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
32220 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32230 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43  UUM.      if( pC
32240 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
32250 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
32260 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
32270 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  eck, iPage, PTRM
32280 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
32290 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
322a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
322b0 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42  if( n>pCheck->pB
322c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  t->usableSize/4-
322d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  2 ){.        che
322e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
322f0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
32300 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69           "freeli
32310 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f  st leaf count to
32320 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64  o big on page %d
32330 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
32340 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     N--;.      }e
32350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
32360 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
32370 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
32380 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34  iFreePage = get4
32390 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
323a0 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66  8+i*4]);.#ifndef
323b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
323c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
323d0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
323e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
323f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65  .            che
32400 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32410 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d   iFreePage, PTRM
32420 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
32430 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
32440 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
32450 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66          checkRef
32460 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
32470 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
32480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32490 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   N -= n;.      }
324a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
324b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
324c0 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a  ACUUM.    else{.
324d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
324e0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
324f0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  ts auto-vacuum a
32500 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20  nd iPage is not 
32510 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
32520 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f  * page in this o
32530 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68  verflow list, ch
32540 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69  eck that the poi
32550 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
32560 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  or.      ** the 
32570 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d  following page m
32580 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20  atches iPage..  
32590 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
325a0 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
325b0 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20  toVacuum && N>0 
325c0 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67  ){.        i = g
325d0 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
325e0 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63  a);.        chec
325f0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
32600 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  i, PTRMAP_OVERFL
32610 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW2, iPage, zCon
32620 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
32630 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32640 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
32650 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
32660 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
32670 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ef(pOvflPage);. 
32680 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
32690 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
326a0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
326b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
326c0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
326d0 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69  CK./*.** Do vari
326e0 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ous sanity check
326f0 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  s on a single pa
32700 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52  ge of a tree.  R
32710 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65  eturn.** the tre
32720 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70  e depth.  Root p
32730 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20  ages return 0.  
32740 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20  Parents of root 
32750 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20  pages.** return 
32760 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  1, and so forth.
32770 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68  .** .** These ch
32780 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a  ecks are done:.*
32790 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61  *.**      1.  Ma
327a0 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c  ke sure that cel
327b0 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b  ls and freeblock
327c0 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70  s do not overlap
327d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74  .**          but
327e0 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70   combine to comp
327f0 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65  letely cover the
32800 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32   page..**  NO  2
32810 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c  .  Make sure cel
32820 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72  l keys are in or
32830 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20  der..**  NO  3. 
32840 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
32850 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
32860 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65  r equal to zLowe
32870 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20  rBound..**  NO  
32880 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  4.  Make sure no
32890 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20   key is greater 
328a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
328b0 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zUpperBound..**
328c0 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20        5.  Check 
328d0 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
328e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
328f0 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63  .**      6.  Rec
32900 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68  ursively call ch
32910 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61  eckTreePage on a
32920 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20  ll children..** 
32930 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20       7.  Verify 
32940 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f  that the depth o
32950 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69  f all children i
32960 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20  s the same..**  
32970 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72      8.  Make sur
32980 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  e this page is a
32990 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c  t least 33% full
329a0 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a   or else it is.*
329b0 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72  *          the r
329c0 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
329d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
329e0 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20  heckTreePage(.  
329f0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
32a00 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74  eck,  /* Context
32a10 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20   for the sanity 
32a20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
32a30 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
32a40 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
32a50 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63  of the page to c
32a60 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  heck */.  MemPag
32a70 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
32a80 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a  /* Parent page *
32a90 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  /.  char *zParen
32aa0 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72  tContext  /* Par
32ab0 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ent context */.)
32ac0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
32ad0 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c  ge;.  int i, rc,
32ae0 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f   depth, d2, pgno
32af0 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72  , cnt;.  int hdr
32b00 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69  , cellStart;.  i
32b10 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a  nt nCell;.  u8 *
32b20 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  data;.  BtShared
32b30 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61   *pBt;.  int usa
32b40 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20  bleSize;.  char 
32b50 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20  zContext[100];. 
32b60 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73   char *hit;..  s
32b70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32b80 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
32b90 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67  , zContext, "Pag
32ba0 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  e %d: ", iPage);
32bb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
32bc0 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74  t the page exist
32bd0 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70  s.  */.  pBt = p
32be0 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73  Check->pBt;.  us
32bf0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
32c00 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66  usableSize;.  if
32c10 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
32c20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65  urn 0;.  if( che
32c30 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
32c40 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74  age, zParentCont
32c50 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ext) ) return 0;
32c60 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
32c70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
32c80 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
32c90 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
32ca0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
32cb0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32cc0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
32cd0 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
32ce0 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
32cf0 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
32d00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32d10 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
32d20 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
32d30 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
32d40 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
32d50 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32d60 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
32d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d80 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65 49    "sqlite3BtreeI
32d90 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
32da0 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
32db0 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
32dc0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32dd0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32de0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
32df0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
32e00 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
32e10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
32e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70  Page->nCell && p
32e30 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b  Check->mxErr; i+
32e40 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
32e50 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
32e60 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
32e70 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
32e80 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77  payload overflow
32e90 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20   pages.    */.  
32ea0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32eb0 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
32ec0 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  xt), zContext,. 
32ed0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
32ee0 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65 6c  tree page %d cel
32ef0 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20  l %d: ", iPage, 
32f00 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  i);.    pCell = 
32f10 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69  findCell(pPage,i
32f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
32f30 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
32f40 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
32f50 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
32f60 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
32f70 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
32f80 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
32f90 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
32fa0 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f   sz==info.nPaylo
32fb0 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  ad );.    if( sz
32fc0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
32fd0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
32fe0 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
32ff0 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
33000 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
33010 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
33020 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
33030 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
33040 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
33050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33060 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33070 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
33080 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
33090 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
330a0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pCheck, pgnoOvfl
330b0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
330c0 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W1, iPage, zCont
330d0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
330e0 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b  ndif.      check
330f0 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20  List(pCheck, 0, 
33100 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c  pgnoOvfl, nPage,
33110 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33120 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
33130 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63  sanity of left c
33140 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a  hild page..    *
33150 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
33160 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
33170 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
33180 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  pCell);.#ifndef 
33190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
331a0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
331b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
331c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
331d0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
331e0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
331f0 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  EE, iPage, zCont
33200 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
33210 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20  ndif.      d2 = 
33220 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
33230 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c  heck,pgno,pPage,
33240 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33250 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d   if( i>0 && d2!=
33260 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20  depth ){.       
33270 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33280 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
33290 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65  , "Child page de
332a0 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20  pth differs");. 
332b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70       }.      dep
332c0 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20  th = d2;.    }. 
332d0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
332e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
332f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
33300 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
33310 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
33320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
33330 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
33340 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
33350 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
33360 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65          "On page
33370 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69   %d at right chi
33380 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23  ld: ", iPage);.#
33390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
333a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
333b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
333c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63  acuum ){.      c
333d0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
333e0 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
333f0 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29  BTREE, iPage, 0)
33400 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
33410 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
33420 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70  (pCheck, pgno, p
33430 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33440 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63  .  }. .  /* Chec
33450 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63  k for complete c
33460 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70  overage of the p
33470 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20  age.  */.  data 
33480 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
33490 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
334a0 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20  drOffset;.  hit 
334b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
334c0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
334d0 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20  ze );.  if( hit 
334e0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  ){.    memset(hi
334f0 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  t, 0, usableSize
33500 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   );.    memset(h
33510 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28  it, 1, get2byte(
33520 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a  &data[hdr+5]));.
33530 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
33540 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
33550 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
33560 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
33570 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
33580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
33590 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
335a0 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
335b0 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
335c0 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75  t+i*2]);.      u
335d0 31 36 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69  16 size = cellSi
335e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
335f0 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69  ta[pc]);.      i
33600 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
33610 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61  (pc+size-1)>=usa
33620 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20  bleSize || pc<0 
33630 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33640 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33650 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
33660 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
33670 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
33680 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
33690 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
336a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
336b0 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20  or(j=pc+size-1; 
336c0 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b  j>=pc; j--) hit[
336d0 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
336e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d    }.    for(cnt=
336f0 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64  0, i=get2byte(&d
33700 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30  ata[hdr+1]); i>0
33710 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65   && i<usableSize
33720 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a   && cnt<10000; .
33730 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
33740 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
33750 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
33760 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ta[i+2]);.      
33770 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
33780 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61   (i+size-1)>=usa
33790 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29  bleSize || i<0 )
337a0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
337b0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
337c0 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20   0,  .          
337d0 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
337e0 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
337f0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
33800 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
33810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
33820 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a  or(j=i+size-1; j
33830 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  >=i; j--) hit[j]
33840 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
33850 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
33860 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  data[i]);.    }.
33870 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b      for(i=cnt=0;
33880 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69   i<usableSize; i
33890 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
338a0 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  it[i]==0 ){.    
338b0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
338c0 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69   }else if( hit[i
338d0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ]>1 ){.        c
338e0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
338f0 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  heck, 0,.       
33900 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65     "Multiple use
33910 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66  s for byte %d of
33920 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50   page %d", i, iP
33930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
33940 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
33950 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
33960 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20  data[hdr+7] ){. 
33970 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
33980 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
33990 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d            "Fragm
339a0 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25  ented space is %
339b0 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  d byte reported 
339c0 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  as %d on page %d
339d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ",.          cnt
339e0 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69  , data[hdr+7], i
339f0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
33a00 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
33a10 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
33a20 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
33a30 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
33a40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
33a50 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
33a60 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
33a70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33a80 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
33a90 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
33aa0 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
33ab0 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
33ac0 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
33ad0 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
33ae0 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
33af0 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
33b00 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
33b10 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
33b20 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
33b30 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
33b40 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
33b50 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
33b60 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
33b70 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69   checks out, thi
33b80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
33b90 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65  s NULL.  If some
33ba0 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73  thing is.** amis
33bb0 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  s, an error mess
33bc0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33bd0 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
33be0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
33bf0 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74  ).** and a point
33c00 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72  er to that error
33c10 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75   message is retu
33c20 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69  rned.  The calli
33c30 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
33c40 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33c50 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72  r freeing the er
33c60 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
33c70 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a   it is done..*/.
33c80 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
33c90 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
33ca0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
33cb0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
33cc0 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
33cd0 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20    int *aRoot,   
33ce0 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72  /* An array of r
33cf0 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
33d00 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c  s for individual
33d10 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20   trees */.  int 
33d20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d  nRoot,    /* Num
33d30 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
33d40 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69  n aRoot[] */.  i
33d50 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20  nt mxErr,    /* 
33d60 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65  Stop reporting e
33d70 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73  rrors after this
33d80 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a   many */.  int *
33d90 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74  pnErr    /* Writ
33da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
33db0 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20  rs seen to this 
33dc0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  variable */.){. 
33dd0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
33de0 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ef;.  IntegrityC
33df0 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68  k sCheck;.  BtSh
33e00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33e10 42 74 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 5b  Bt;.  char zErr[
33e20 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
33e30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
33e40 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
33e50 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  ;.  nRef = sqlit
33e60 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
33e70 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
33e80 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  if( lockBtreeWit
33e90 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54  hRetry(p)!=SQLIT
33ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
33eb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
33ec0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
33ed0 69 74 65 33 53 74 72 44 75 70 28 22 55 6e 61 62  ite3StrDup("Unab
33ee0 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  le to acquire a 
33ef0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
33f00 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d   database");.  }
33f10 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20  .  sCheck.pBt = 
33f20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50  pBt;.  sCheck.pP
33f30 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
33f40 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61  er;.  sCheck.nPa
33f50 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
33f60 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
33f70 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
33f80 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
33f90 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
33fa0 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66   *pnErr = 0;.#if
33fb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33fc0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
33fd0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30  ( pBt->nTrunc!=0
33fe0 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e   ){.    sCheck.n
33ff0 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Page = pBt->nTru
34000 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  nc;.  }.#endif. 
34010 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67   if( sCheck.nPag
34020 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  e==0 ){.    unlo
34030 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
34040 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
34050 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
34060 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
34070 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
34080 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
34090 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
340a0 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
340b0 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
340c0 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
340d0 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    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 2a 70 6e 45 72 72 20 3d 20  );.    *pnErr = 
34100 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
34110 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
34120 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
34130 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55  Printf(p->db, "U
34140 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  nable to malloc 
34150 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20  %d bytes", .    
34160 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67      (sCheck.nPag
34170 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
34180 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20  ck.anRef[0]));. 
34190 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
341a0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
341b0 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
341c0 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
341d0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
341e0 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
341f0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
34200 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
34210 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
34220 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
34230 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e 65 72  mInit(&sCheck.er
34240 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65  rMsg, zErr, size
34250 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30 30 29  of(zErr), 20000)
34260 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
34270 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
34280 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f  he freelist.  */
34290 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43  .  checkList(&sC
342a0 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74  heck, 1, get4byt
342b0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
342c0 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20  aData[32]),.    
342d0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
342e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
342f0 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e  Data[36]), "Main
34300 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a   freelist: ");..
34310 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74    /* Check all t
34320 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  he tables..  */.
34330 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f    for(i=0; i<nRo
34340 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ot && sCheck.mxE
34350 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rr; i++){.    if
34360 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20  ( aRoot[i]==0 ) 
34370 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
34380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34390 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
343a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
343b0 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29   && aRoot[i]>1 )
343c0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
343d0 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  map(&sCheck, aRo
343e0 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f  ot[i], PTRMAP_RO
343f0 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20  OTPAGE, 0, 0);. 
34400 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
34410 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73  checkTreePage(&s
34420 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
34430 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65   0, "List of tre
34440 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d  e roots: ");.  }
34450 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
34460 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
34470 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72  he file is refer
34480 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72  enced.  */.  for
34490 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e  (i=1; i<=sCheck.
344a0 6e 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e  nPage && sCheck.
344b0 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66  mxErr; i++){.#if
344c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
344d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
344e0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
344f0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  i]==0 ){.      c
34500 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
34510 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
34520 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
34530 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ", i);.    }.#el
34540 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  se.    /* If the
34550 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
34560 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
34570 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62  make sure no tab
34580 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  les contain.    
34590 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
345a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
345b0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
345c0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
345d0 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]==0 && .      
345e0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
345f0 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70  pBt, i)!=i || !p
34600 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
34610 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
34620 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
34630 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
34640 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
34650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
34660 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d  Check.anRef[i]!=
34670 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54  0 && .       (PT
34680 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
34690 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61   i)==i && pBt->a
346a0 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
346b0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
346c0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
346d0 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
346e0 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65   %d is reference
346f0 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
34700 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ndif.  }..  /* M
34710 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e  ake sure this an
34720 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c  alysis did not l
34730 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29  eave any unref()
34740 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e   pages.  */.  un
34750 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
34760 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52  d(pBt);.  if( nR
34770 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67  ef != sqlite3Pag
34780 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
34790 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63  pPager) ){.    c
347a0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
347b0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
347c0 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61   "Outstanding pa
347d0 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72  ge count goes fr
347e0 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69  om %d to %d duri
347f0 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  ng this analysis
34800 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73  ",.      nRef, s
34810 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
34820 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
34830 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  .    );.  }..  /
34840 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20  * Clean  up and 
34850 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20  report errors.. 
34860 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
34870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71  eeLeave(p);.  sq
34880 6c 69 74 65 33 5f 66 72 65 65 28 73 43 68 65 63  lite3_free(sChec
34890 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45  k.anRef);.  *pnE
348a0 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
348b0 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
348c0 45 72 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Err==0 ) sqlite3
348d0 53 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 73  StrAccumReset(&s
348e0 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20  Check.errMsg);. 
348f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
34900 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73  trAccumFinish(&s
34910 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d  Check.errMsg);.}
34920 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
34930 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
34940 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
34950 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
34960 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
34970 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
34980 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
34990 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e   The pager filen
349a0 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
349b0 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
349c0 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
349d0 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
349e0 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
349f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
34a00 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
34a10 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
34a20 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
34a30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
34a40 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
34a50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
34a60 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
34a70 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
34a80 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
34a90 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
34aa0 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
34ab0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
34ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34ad0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
34ae0 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ger directory na
34af0 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
34b00 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
34b10 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
34b20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
34b30 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
34b40 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
34b50 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
34b60 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
34b70 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
34b80 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
34b90 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
34ba0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
34bb0 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
34bc0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
34bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34be0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
34bf0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
34c00 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
34c10 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
34c20 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
34c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
34c40 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
34c50 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
34c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
34c70 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
34c80 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   or not..**.** T
34c90 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c  he pager journal
34ca0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
34cb0 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
34cc0 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
34cd0 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
34ce0 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
34cf0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
34d00 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
34d10 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
34d20 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
34d30 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
34d40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34d50 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34d60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34d70 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
34d80 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
34d90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
34da0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
34db0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
34dc0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
34dd0 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
34de0 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
34df0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
34e00 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
34e10 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
34e20 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54   size of file pT
34e30 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  o may be reduced
34e40 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
34e50 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
34e60 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
34e70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
34e80 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20  n pTo is rolled 
34e90 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
34ea0 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d  successful, Comm
34eb0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79  itPhaseOne() may
34ec0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54   be called on pT
34ed0 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
34ee0 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ng. .** The call
34ef0 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68  er should finish
34f00 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
34f10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
34f20 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  To by calling.**
34f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
34f40 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  mit()..*/.static
34f50 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69   int btreeCopyFi
34f60 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
34f70 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
34f80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34f90 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20  OK;.  Pgno i;.. 
34fa0 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b   Pgno nFromPage;
34fb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34fc0 66 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d  f pages in pFrom
34fd0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61   */.  Pgno nToPa
34fe0 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ge;       /* Num
34ff0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
35000 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e  pTo */.  Pgno nN
35010 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  ewPage;      /* 
35020 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35030 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65  in pTo after the
35040 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f   copy */..  Pgno
35050 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   iSkip;         
35060 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20  /* Pending byte 
35070 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  page in pTo */. 
35080 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65   int nToPageSize
35090 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ;    /* Page siz
350a0 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65  e of pTo in byte
350b0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d  s */.  int nFrom
350c0 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61  PageSize;  /* Pa
350d0 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d  ge size of pFrom
350e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
350f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
35100 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
35110 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
35120 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
35130 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
35140 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
35150 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
35160 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d  .  nToPageSize =
35170 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
35180 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  ;.  nFromPageSiz
35190 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67  e = pBtFrom->pag
351a0 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54  eSize;..  if( pT
351b0 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
351c0 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
351d0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
351e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
351f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35200 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
35210 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  To->pCursor ){. 
35220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35230 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54  _BUSY;.  }..  nT
35240 6f 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  oPage = pagerPag
35250 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50  ecount(pBtTo->pP
35260 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61  ager);.  nFromPa
35270 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
35280 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
35290 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
352a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
352b0 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20  E(pBtTo);..  /* 
352c0 56 61 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67  Variable nNewPag
352d0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
352e0 6f 66 20 70 61 67 65 73 20 72 65 71 75 69 72 65  of pages require
352f0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20  d to store the. 
35300 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
35310 70 46 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20  pFrom using the 
35320 63 75 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a  current page-siz
35330 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20  e of pTo..  */. 
35340 20 6e 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36   nNewPage = ((i6
35350 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69  4)nFromPage * (i
35360 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
35370 20 2b 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   + (i64)nToPageS
35380 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20  ize - 1) / .    
35390 20 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69    (i64)nToPageSi
353a0 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ze;..  for(i=1; 
353b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
353c0 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20   (i<=nToPage || 
353d0 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b  i<=nNewPage); i+
353e0 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72  +){..    /* Jour
353f0 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nal the original
35400 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   page..    **.  
35410 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68    ** iSkip is th
35420 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
35430 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35440 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e (PENDING_BYTE_
35450 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20  PAGE).    ** in 
35460 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62  database *pTo (b
35470 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e  efore the copy).
35480 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65   This page is ne
35490 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20  ver written .   
354a0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75   ** into the jou
354b0 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73  rnal file. Unles
354c0 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68  s i==iSkip or th
354d0 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20  e page was not. 
354e0 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e     ** present in
354f0 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20   pTo before the 
35500 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20  copy operation, 
35510 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66  journal page i f
35520 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a  rom pTo..    */.
35530 20 20 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70      if( i!=iSkip
35540 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29   && i<=nToPage )
35550 7b 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a  {.      DbPage *
35560 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  pDbPage = 0;.   
35570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35580 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
35590 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
355a0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
355b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
355c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
355d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
355e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
355f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35600 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67  OK && i>nFromPag
35610 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
35620 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
35630 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
35640 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
35650 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
35660 20 42 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a   But.          *
35670 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
35680 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
35690 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
356a0 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
356b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
356c0 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79  resent what they
356d0 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65   do.  Write() re
356e0 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20  ally means "put 
356f0 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65  this page in the
35700 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
35710 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
35720 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69  nd mark it as di
35730 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  rty so that it w
35740 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20  ill be written. 
35750 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74           ** to t
35760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35770 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72   later."  DontWr
35780 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65  ite() undoes the
35790 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a   second part of.
357a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
357b0 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74  t and prevents t
357c0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  he page from bei
357d0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ng written to th
357e0 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a  e database. The.
357f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
35800 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  e is still on th
35810 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
35820 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64  al, though.  And
35830 20 74 68 61 74 20 69 73 20 74 68 65 20 0a 20 20   that is the .  
35840 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65          ** whole
35850 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62   point of this b
35860 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67  lock: to put pag
35870 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
35880 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ck journal. .   
35890 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
358a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
358b0 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67  DontWrite(pDbPag
358c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
358d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
358e0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
358f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35900 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
35910 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61  e the data in pa
35920 67 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67  ge i of the targ
35930 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  et database */. 
35940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35950 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70  E_OK && i!=iSkip
35960 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20   && i<=nNewPage 
35970 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65  ){..      DbPage
35980 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20   *pToPage = 0;. 
35990 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
359a0 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20  64 iOff;..      
359b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
359c0 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  rGet(pBtTo->pPag
359d0 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29  er, i, &pToPage)
359e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
359f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a10 33 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50  3PagerWrite(pToP
35a20 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  age);.      }.. 
35a30 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20       for(.      
35a40 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f    iOff=(i-1)*nTo
35a50 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
35a60 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
35a70 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61   && iOff<i*nToPa
35a80 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20  geSize; .       
35a90 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
35aa0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a  geSize.      ){.
35ab0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
35ac0 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20  pFromPage = 0;. 
35ad0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f         Pgno iFro
35ae0 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50  m = (iOff/nFromP
35af0 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20  ageSize)+1;..   
35b00 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
35b10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35b20 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20  E(pBtFrom) ){.  
35b30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
35b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
35b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35b60 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
35b70 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d  m->pPager, iFrom
35b80 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  , &pFromPage);. 
35b90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35bb0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20        char *zTo 
35bc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
35bd0 74 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a  tData(pToPage);.
35be0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
35bf0 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50  zFrom = sqlite3P
35c00 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f  agerGetData(pFro
35c10 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
35c20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20    int nCopy;..  
35c30 20 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f          if( nFro
35c40 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61  mPageSize>=nToPa
35c50 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
35c60 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28        zFrom += (
35c70 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
35c80 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e  e - ((iFrom-1)*n
35c90 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a  FromPageSize));.
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70              nCop
35cb0 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b  y = nToPageSize;
35cc0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
35cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
35ce0 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29  o += (((iFrom-1)
35cf0 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20  *nFromPageSize) 
35d00 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53  - (i-1)*nToPageS
35d10 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
35d20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50    nCopy = nFromP
35d30 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
35d40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
35d50 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f  memcpy(zTo, zFro
35d60 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71  m, nCopy);..  sq
35d70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35d80 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
35d90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
35da0 20 20 20 20 20 69 66 28 20 70 54 6f 50 61 67 65       if( pToPage
35db0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
35dc0 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b 0a 20  nref(pToPage);. 
35dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
35de0 66 20 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f  f things have wo
35df0 72 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65  rked so far, the
35e00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
35e10 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20  ay need to be . 
35e20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54   ** truncated. T
35e30 68 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20  he complex part 
35e40 69 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e  is that it may n
35e50 65 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61  eed to be trunca
35e60 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69  ted to.  ** a si
35e70 7a 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ze that is not a
35e80 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
35e90 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a  le of nToPageSiz
35ea0 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a  e - the current.
35eb0 20 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75    ** page size u
35ec0 73 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72  sed by the pager
35ed0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35ee0 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a   B-Tree pTo..  *
35ef0 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70  *.  ** For examp
35f00 6c 65 2c 20 73 61 79 20 74 68 65 20 70 61 67 65  le, say the page
35f10 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20  -size of pTo is 
35f20 32 30 34 38 20 62 79 74 65 73 20 61 6e 64 20 74  2048 bytes and t
35f30 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a  he original .  *
35f40 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
35f50 73 20 69 73 20 35 20 28 31 30 20 4b 42 20 66 69  s is 5 (10 KB fi
35f60 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61  le). If pFrom ha
35f70 73 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66  s a page size of
35f80 20 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65   1024 .  ** byte
35f90 73 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74  s and 9 pages, t
35fa0 68 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65  hen the file nee
35fb0 64 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74  ds to be truncat
35fc0 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a  ed to 9KB..  */.
35fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
35ff0 46 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54  FromPageSize!=nT
36000 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  oPageSize ){.   
36010 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
36020 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
36030 50 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d  PagerFile(pBtTo-
36040 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
36050 69 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34  i64 iSize = (i64
36060 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a  )nFromPageSize *
36070 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b   (i64)nFromPage;
36080 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20  .      i64 iNow 
36090 3d 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65  = (i64)((nToPage
360a0 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61  >nNewPage)?nToPa
360b0 67 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28  ge:nNewPage) * (
360c0 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b  i64)nToPageSize;
360d0 20 0a 20 20 20 20 20 20 69 36 34 20 69 50 65 6e   .      i64 iPen
360e0 64 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e  ding = ((i64)PEN
360f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36100 42 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e  BtTo)-1) *(i64)n
36110 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20  ToPageSize;.  . 
36120 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 69       assert( iSi
36130 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20  ze<=iNow );.  . 
36140 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70       /* Commit p
36150 68 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74  hase one syncs t
36160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36170 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36180 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  pTo .      ** co
36190 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69  ntaining the ori
361a0 67 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64  ginal data. It d
361b0 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65  oes not sync the
361c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
361d0 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20       ** itself. 
361e0 41 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73  After doing this
361f0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
36200 73 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  se OsTruncate() 
36210 61 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20  and other.      
36220 2a 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20  ** file APIs on 
36230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36240 65 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  e directly..    
36250 20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f    */.      pBtTo
36260 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a  ->db = pTo->db;.
36270 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36280 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
36290 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61  seOne(pBtTo->pPa
362a0 67 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20  ger, 0, 0, 1);. 
362b0 20 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69       if( iSize<i
362c0 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Now && rc==SQLIT
362d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
362e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
362f0 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53  uncate(pFile, iS
36300 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
36310 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  .      /* The lo
36320 6f 70 20 74 68 61 74 20 63 6f 70 69 65 64 20 64  op that copied d
36330 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ata from databas
36340 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64  e pFrom to pTo d
36350 69 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  id not.      ** 
36360 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63  populate the loc
36370 6b 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74  king page of dat
36380 61 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68  abase pTo. If th
36390 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20  e page-size of. 
363a0 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73       ** pFrom is
363b0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
363c0 61 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20  at of pTo, this 
363d0 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20  means some data 
363e0 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  will.      ** no
363f0 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69  t have been copi
36400 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed. .      **.  
36410 20 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63      ** This bloc
36420 6b 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73  k copies the mis
36430 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64  sing data from d
36440 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f  atabase pFrom to
36450 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75   pTo .      ** u
36460 73 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20  sing file APIs. 
36470 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
36480 61 75 73 65 20 61 74 20 74 68 69 73 20 70 6f 69  ause at this poi
36490 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a  nt we know that.
364a0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20        ** all of 
364b0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
364c0 61 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62  a from pTo has b
364d0 65 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  een synced into 
364e0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
364f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74  urnal file. At t
36500 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75  his point it wou
36510 6c 64 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f  ld be safe to do
36520 20 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20   anything at.   
36530 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65     ** all to the
36540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 65   database file e
36550 78 63 65 70 74 20 74 72 75 6e 63 61 74 65 20 69  xcept truncate i
36560 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e  t to zero bytes.
36570 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36590 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69  K && nFromPageSi
365a0 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26  ze<nToPageSize &
365b0 26 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67  & iSize>iPending
365c0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
365d0 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Off;.        for
365e0 28 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  (.          iOff
365f0 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20  =iPending; .    
36600 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
36610 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65  _OK && iOff<(iPe
36620 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a  nding+nToPageSiz
36630 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69  e); .          i
36640 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65  Off += nFromPage
36650 53 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a  Size.        ){.
36660 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
36670 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b   *pFromPage = 0;
36680 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
36690 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46  iFrom = (iOff/nF
366a0 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a  romPageSize)+1;.
366b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
366c0 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f   iFrom==PENDING_
366d0 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f  BYTE_PAGE(pBtFro
366e0 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f  m) || iFrom>nFro
366f0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  mPage ){.       
36700 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
36710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
36720 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36730 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
36740 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46  From->pPager, iF
36750 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29  rom, &pFromPage)
36760 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36780 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
36790 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74  r *zFrom = sqlit
367a0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
367b0 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09 20 20  FromPage);.  .  
367c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
367d0 69 74 65 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d  ite(pFile, zFrom
367e0 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c  , nFromPageSize,
367f0 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
36800 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
36810 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29  Unref(pFromPage)
36820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36840 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63    .      /* Sync
36850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36860 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
36870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36890 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
368a0 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
368b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
368c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
368d0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
368e0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
368f0 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20 20 20   nNewPage);.    
36900 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
36910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36920 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
36930 46 69 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  Fixed = 0;.    }
36940 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
36950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
36960 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b  eeRollback(pTo);
36970 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
36980 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  c;  .}.int sqlit
36990 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28  e3BtreeCopyFile(
369a0 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65  Btree *pTo, Btre
369b0 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  e *pFrom){.  int
369c0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
369d0 72 65 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20  reeEnter(pTo);. 
369e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
369f0 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20  er(pFrom);.  rc 
36a00 3d 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28  = btreeCopyFile(
36a10 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73  pTo, pFrom);.  s
36a20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
36a30 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74  (pFrom);.  sqlit
36a40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f  e3BtreeLeave(pTo
36a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
36a60 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
36a70 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20  ITE_OMIT_VACUUM 
36a80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
36a90 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74   non-zero if a t
36aa0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
36ab0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
36ac0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
36ad0 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ns(Btree *p){.  
36ae0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
36af0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
36b00 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
36b10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
36b20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  && (p->inTrans==
36b30 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d  TRANS_WRITE));.}
36b40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
36b50 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61  on-zero if a sta
36b60 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
36b70 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
36b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36b90 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20  eIsInStmt(Btree 
36ba0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
36bb0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
36bc0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
36bd0 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20  turn (p->pBt && 
36be0 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b  p->pBt->inStmt);
36bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36c00 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72   non-zero if a r
36c10 65 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74  ead (or write) t
36c20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
36c30 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
36c40 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
36c50 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  dTrans(Btree *p)
36c60 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
36c70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36c80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
36c90 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
36ca0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
36cb0 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  S_NONE));.}../*.
36cc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
36cd0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
36ce0 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
36cf0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
36d00 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
36d10 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
36d20 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
36d30 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
36d40 64 65 20 66 6f 72 20 69 74 73 20 6f 77 6e 0a 2a  de for its own.*
36d50 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20  * purposes (for 
36d60 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72  example, to stor
36d70 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73  e a high-level s
36d80 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64  chema associated
36d90 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68   with .** the sh
36da0 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65  ared-btree). The
36db0 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e   btree layer man
36dc0 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63  ages reference c
36dd0 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a  ounting issues..
36de0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
36df0 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c  time this is cal
36e00 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d  led on a shared-
36e10 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79  btree, nBytes by
36e20 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
36e30 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
36e40 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75  zeroed, and retu
36e50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
36e60 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62  er. For each sub
36e70 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c  sequent .** call
36e80 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61   the nBytes para
36e90 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
36ea0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
36eb0 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a  o the same blob.
36ec0 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74  ** of memory ret
36ed0 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  urned. .**.** If
36ee0 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61   the nBytes para
36ef0 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
36f00 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
36f10 79 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  y has not yet be
36f20 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c  en.** allocated,
36f30 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 20   a null pointer 
36f40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
36f50 74 68 65 20 62 6c 6f 62 20 68 61 73 20 61 6c 72  the blob has alr
36f60 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c  eady been.** all
36f70 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 72 65  ocated, it is re
36f80 74 75 72 6e 65 64 20 61 73 20 6e 6f 72 6d 61 6c  turned as normal
36f90 2e 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66  ..**.** Just bef
36fa0 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62  ore the shared-b
36fb0 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  tree is closed, 
36fc0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73  the function pas
36fd0 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78  sed as the .** x
36fe0 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68  Free argument wh
36ff0 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  en the memory al
37000 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64  location was mad
37010 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  e is invoked on 
37020 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20  the .** blob of 
37030 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
37040 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
37050 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20  should not call 
37060 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a  sqlite3_free().*
37070 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c  * on the memory,
37080 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
37090 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76   does that..*/.v
370a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
370b0 65 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70  eSchema(Btree *p
370c0 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f  , int nBytes, vo
370d0 69 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20  id(*xFree)(void 
370e0 2a 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *)){.  BtShared 
370f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
37100 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37110 65 72 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42  er(p);.  if( !pB
37120 74 2d 3e 70 53 63 68 65 6d 61 20 26 26 20 6e 42  t->pSchema && nB
37130 79 74 65 73 20 29 7b 0a 20 20 20 20 70 42 74 2d  ytes ){.    pBt-
37140 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
37150 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79  e3MallocZero(nBy
37160 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
37170 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
37180 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ee;.  }.  sqlite
37190 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
371a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
371b0 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
371c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
371d0 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
371e0 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
371f0 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
37200 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
37210 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
37220 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
37230 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
37240 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
37250 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
37260 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
37270 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
37280 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37290 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
372a0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
372b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
372c0 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65  rc = (queryTable
372d0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
372e0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
372f0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73  =SQLITE_OK);.  s
37300 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
37310 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
37320 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
37330 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
37340 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
37350 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
37360 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
37370 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
37380 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
37390 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
373a0 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
373b0 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
373c0 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
373d0 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
373e0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
373f0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
37400 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
37410 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
37420 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37430 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
37440 20 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54   ){.    u8 lockT
37450 79 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20  ype = READ_LOCK 
37460 2b 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20  + isWriteLock;. 
37470 20 20 20 61 73 73 65 72 74 28 20 52 45 41 44 5f     assert( READ_
37480 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f  LOCK+1==WRITE_LO
37490 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
374a0 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30  ( isWriteLock==0
374b0 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d   || isWriteLock=
374c0 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
374d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
374e0 20 20 20 20 72 63 20 3d 20 71 75 65 72 79 54 61      rc = queryTa
374f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c  bleLock(p, iTab,
37500 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37510 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37520 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
37530 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
37540 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
37550 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
37560 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
37570 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37580 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
37590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
375a0 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75  RBLOB./*.** Argu
375b0 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62  ment pCsr must b
375c0 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  e a cursor opene
375d0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e  d for writing on
375e0 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74   an .** INTKEY t
375f0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70  able currently p
37600 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
37610 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  id table entry. 
37620 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37630 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64  n modifies the d
37640 61 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61  ata stored as pa
37650 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79  rt of that entry
37660 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61  ..** Only the da
37670 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f  ta content may o
37680 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  nly be modified,
37690 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
376a0 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65  ble.** to change
376b0 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
376c0 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a  he data stored..
376d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
376e0 72 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72  reePutData(BtCur
376f0 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f  sor *pCsr, u32 o
37700 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
37710 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65  void *z){.  asse
37720 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
37730 75 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20  utex(pCsr) );.  
37740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37750 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d  mutex_held(pCsr-
37760 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
37770 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
37780 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCsr->isIncrblob
37790 48 61 6e 64 6c 65 29 3b 0a 0a 20 20 72 65 73 74  Handle);..  rest
377a0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
377b0 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 29 3b 0a  Position(pCsr);.
377c0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
377d0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 52  eState!=CURSOR_R
377e0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
377f0 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65  if( pCsr->eState
37800 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
37810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37820 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a  ITE_ABORT;.  }..
37830 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20    /* Check some 
37840 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a  preconditions: .
37850 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63    **   (a) the c
37860 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f  ursor is open fo
37870 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20  r writing,.  ** 
37880 20 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e    (b) there is n
37890 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  o read-lock on t
378a0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d  he table being m
378b0 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a  odified and.  **
378c0 20 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f     (c) the curso
378d0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61  r points at a va
378e0 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e  lid row of an in
378f0 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  tKey table..  */
37900 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72  .  if( !pCsr->wr
37910 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
37920 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
37930 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  LY;.  }.  assert
37940 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65  ( !pCsr->pBt->re
37950 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  adOnly .        
37960 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e    && pCsr->pBt->
37970 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
37980 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
37990 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
379a0 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c  ks(pCsr->pBtree,
379b0 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCsr->pgnoRoot,
379c0 20 70 43 73 72 2c 20 30 29 20 29 7b 0a 20 20 20   pCsr, 0) ){.   
379d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
379e0 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
379f0 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
37a00 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
37a10 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ck */.  }.  if( 
37a20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCsr->eState==CU
37a30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
37a40 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCsr->pPage->in
37a50 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
37a60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
37a70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
37a80 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73  ccessPayload(pCs
37a90 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
37aa0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
37ab0 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  )z, 0, 1);.}../*
37ac0 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20   .** Set a flag 
37ad0 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74  on this cursor t
37ae0 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61  o cache the loca
37af0 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66  tions of pages f
37b00 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72  rom the .** over
37b10 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68  flow list for th
37b20 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54  e current row. T
37b30 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63  his is used by c
37b40 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
37b50 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c   for incremental
37b60 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a   blob IO only..*
37b70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37b80 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f  on sets a flag o
37b90 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20  nly. The actual 
37ba0 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61  page location ca
37bb0 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69  che.** (stored i
37bc0 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  n BtCursor.aOver
37bd0 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63  flow[]) is alloc
37be0 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79  ated and used by
37bf0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63   function.** acc
37c00 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68  essPayload() (th
37c10 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f  e worker functio
37c20 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72  n for sqlite3Btr
37c30 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20  eeData() and.** 
37c40 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44  sqlite3BtreePutD
37c50 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ata())..*/.void 
37c60 73 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68  sqlite3BtreeCach
37c70 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73  eOverflow(BtCurs
37c80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
37c90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
37ca0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
37cb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37cc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
37cd0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
37ce0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
37cf0 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  (!pCur->isIncrbl
37d00 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73  obHandle);.  ass
37d10 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
37d20 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69  flow);.  pCur->i
37d30 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
37d40 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a        = 1;.}.#endif.