/ Hex Artifact Content
Login

Artifact 3e686f899659df8d79f2587d0f34f51fdf6a6276:


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 35 32 35 20 32 30 30 38 2f 31  c,v 1.525 2008/1
0190: 30 2f 30 38 20 31 37 3a 35 38 3a 34 39 20 64 61  0/08 17:58:49 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  f../*.** Sometim
0430: 65 73 20 77 65 20 6e 65 65 64 20 61 20 73 6d 61  es we need a sma
0440: 6c 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 64  ll amount of cod
0450: 65 20 73 75 63 68 20 61 73 20 61 20 76 61 72 69  e such as a vari
0460: 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
0470: 69 6f 6e 0a 2a 2a 20 74 6f 20 73 65 74 75 70 20  ion.** to setup 
0480: 66 6f 72 20 61 20 6c 61 74 65 72 20 61 73 73 65  for a later asse
0490: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20  rt() statement. 
04a0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
04b0: 74 68 69 73 20 63 6f 64 65 20 74 6f 0a 2a 2a 20  this code to.** 
04c0: 61 70 70 65 61 72 20 77 68 65 6e 20 61 73 73 65  appear when asse
04d0: 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
04e0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
04f0: 20 6d 61 63 72 6f 20 69 73 20 74 68 65 72 65 66   macro is theref
0500: 6f 72 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63  ore.** used to c
0510: 6f 6e 74 61 69 6e 20 74 68 61 74 20 73 65 74 75  ontain that setu
0520: 70 20 63 6f 64 65 2e 20 20 54 68 65 20 22 56 56  p code.  The "VV
0530: 41 22 20 61 63 72 6f 6e 79 6d 20 73 74 61 6e 64  A" acronym stand
0540: 73 20 66 6f 72 0a 2a 2a 20 22 56 65 72 69 66 69  s for.** "Verifi
0550: 63 61 74 69 6f 6e 2c 20 56 61 6c 69 64 61 74 69  cation, Validati
0560: 6f 6e 2c 20 61 6e 64 20 41 63 63 72 65 64 69 74  on, and Accredit
0570: 61 74 69 6f 6e 22 2e 20 20 49 6e 20 6f 74 68 65  ation".  In othe
0580: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
0590: 63 6f 64 65 20 77 69 74 68 69 6e 20 56 56 41 5f  code within VVA_
05a0: 4f 4e 4c 59 28 29 20 77 69 6c 6c 20 6f 6e 6c 79  ONLY() will only
05b0: 20 72 75 6e 20 64 75 72 69 6e 67 20 76 65 72 69   run during veri
05c0: 66 69 63 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  fication process
05d0: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  es..*/.#ifndef N
05e0: 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 56  DEBUG.# define V
05f0: 56 41 5f 4f 4e 4c 59 28 58 29 20 20 58 0a 23 65  VA_ONLY(X)  X.#e
0600: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 56 56 41  lse.# define VVA
0610: 5f 4f 4e 4c 59 28 58 29 0a 23 65 6e 64 69 66 0a  _ONLY(X).#endif.
0620: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
0630: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0640: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0650: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0660: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0670: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0680: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0690: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
06a0: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
06b0: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
06c0: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
06d0: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
06e0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
06f0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
0700: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
0710: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
0720: 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ilds..*/.#ifdef 
0730: 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68  SQLITE_TEST.BtSh
0740: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0750: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0760: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6c  cheList = 0;.#el
0770: 73 65 0a 73 74 61 74 69 63 20 42 74 53 68 61 72  se.static BtShar
0780: 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73  ed *SQLITE_WSD s
0790: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
07a0: 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e 64 69  eList = 0;.#endi
07b0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
07c0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
07d0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
07e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
07f0: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
0800: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0810: 65 20 74 68 65 20 73 68 61 72 65 64 20 70 61 67  e the shared pag
0820: 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20 66 65  er and schema fe
0830: 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atures..**.** Th
0840: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 6e  is routine has n
0850: 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78 69 73  o effect on exis
0860: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ting database co
0870: 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68  nnections..** Th
0880: 65 20 73 68 61 72 65 64 20 63 61 63 68 65 20 73  e shared cache s
0890: 65 74 74 69 6e 67 20 65 66 66 65 63 74 73 20 6f  etting effects o
08a0: 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c 6c 73  nly future calls
08b0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   to.** sqlite3_o
08c0: 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 6f  pen(), sqlite3_o
08d0: 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71 6c 69  pen16(), or sqli
08e0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a  te3_open_v2()..*
08f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e  /.int sqlite3_en
0900: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
0910: 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b 0a 20  e(int enable){. 
0920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0930: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
0940: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
0950: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0960: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
0970: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
0980: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
0990: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
09a0: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 20  adLocks(Btree*, 
09b0: 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c  Pgno, BtCursor*,
09c0: 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20   i64);...#ifdef 
09d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
09e0: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
09f0: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
0a00: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0a10: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
0a20: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
0a30: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
0a40: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0a50: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0a60: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0a70: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0a80: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0a90: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0aa0: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0ab0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ac0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0ad0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0ae0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0af0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b00: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0b10: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0b20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0b30: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0b40: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0b50: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0b60: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0b70: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0b80: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0b90: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
0ba0: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0bb0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0bc0: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
0bd0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0be0: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
0bf0: 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a  bles(a).#endif..
0c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0c10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0c20: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
0c30: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
0c40: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
0c50: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
0c60: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
0c70: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0c80: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
0c90: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
0ca0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
0cb0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
0cc0: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
0cd0: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
0ce0: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
0cf0: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
0d00: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
0d10: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
0d20: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0d30: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0d40: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0d50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0d60: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0d70: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0d80: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0d90: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0da0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0db0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0dc0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0de0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  0 );.  .  /* Thi
0df0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
0e00: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
0e10: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
0e20: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
0e30: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
0e40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
0e50: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
0e60: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
0e70: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
0e80: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
0e90: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
0ea0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
0eb0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
0ec0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78  /.  if( pBt->pEx
0ed0: 63 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e  clusive && pBt->
0ee0: 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b  pExclusive!=p ){
0ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0f00: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
0f10: 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67    /* This (along
0f20: 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28   with lockTable(
0f30: 29 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20  )) is where the 
0f40: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0f50: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61  flag is.  ** dea
0f60: 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20  lt with. If the 
0f70: 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69  caller is queryi
0f80: 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ng for a read-lo
0f90: 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20  ck and the flag 
0fa0: 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20  is.  ** set, it 
0fb0: 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  is unconditional
0fc0: 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65  ly granted - eve
0fd0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77  n if there are w
0fe0: 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20  rite-locks.  ** 
0ff0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  on the table. If
1000: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73   a write-lock is
1010: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20   requested, the 
1020: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
1030: 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  flag.  ** is not
1040: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a   considered..  *
1050: 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69  *.  ** In functi
1060: 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20  on lockTable(), 
1070: 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  if a read-lock i
1080: 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74  s demanded and t
1090: 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63  he .  ** ReadUnc
10a0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
10b0: 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69   set, no entry i
10c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  s added to the l
10d0: 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20  ocks list .  ** 
10e0: 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29  (BtShared.pLock)
10f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73  ..  **.  ** To s
1100: 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65  ummarize: If the
1110: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
1120: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
1130: 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  en read cursors 
1140: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61  do.  ** not crea
1150: 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61  te or respect ta
1160: 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c  ble locks. The l
1170: 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65  ocking procedure
1180: 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69   for a .  ** wri
1190: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
11a0: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
11b0: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
11c0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
11d0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
11e0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
11f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1200: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
1210: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1220: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1230: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1240: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1250: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1260: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
1270: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
1280: 54 61 62 20 26 26 20 0a 20 20 20 20 20 20 20 20  Tab && .        
1290: 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21    (pIter->eLock!
12a0: 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21  =eLock || eLock!
12b0: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  =READ_LOCK) ){. 
12c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12d0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
12e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1300: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
1310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1320: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
1330: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1340: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
1350: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
1360: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1370: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
1380: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
1390: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
13a0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
13b0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
13c0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
13d0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
13e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
13f0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1400: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1410: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
1420: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
1430: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53  TE_BUSY and.** S
1440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20  QLITE_NOMEM may 
1450: 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64  also be returned
1460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1470: 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  lockTable(Btree 
1480: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1490: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
14a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14b0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
14c0: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
14d0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
14f0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1510: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1520: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
1530: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1540: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
1550: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
1560: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
1570: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1580: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1590: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15b0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
15c0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
15d0: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
15e0: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
15f0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1600: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
1610: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
1620: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
1630: 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20  requested,.  ** 
1640: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
1650: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1660: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1670: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1680: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1690: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
16a0: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66  eryTableLock() f
16b0: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20  or more info on 
16c0: 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74  handling .  ** t
16d0: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
16e0: 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20  ed flag..  */.  
16f0: 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d  if( .    (p->db-
1700: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
1710: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
1720: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
1730: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
1740: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
1750: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
1760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1770: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1780: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
1790: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
17a0: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
17b0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
17c0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
17d0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
17e0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
17f0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
1800: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
1810: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
1820: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
1830: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
1840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1850: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
1860: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
1870: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
1880: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
1890: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
18a0: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
18b0: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
18c0: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
18d0: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
18e0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
18f0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
1900: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1910: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63  ero(sizeof(BtLoc
1920: 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c  k));.    if( !pL
1930: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
1940: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
1960: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
1970: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
1980: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
1990: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
19a0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
19b0: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
19c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
19d0: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
19e0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
19f0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
1a00: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
1a10: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
1a20: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
1a30: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
1a40: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
1a50: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
1a60: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
1a70: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
1a80: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
1a90: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
1aa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
1ab0: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
1ac0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
1ad0: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
1ae0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
1af0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
1b00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b10: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1b20: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
1b30: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
1b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b50: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1b60: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
1b70: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
1b80: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
1b90: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
1ba0: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
1bb0: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
1bc0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1bd0: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
1be0: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
1bf0: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
1c00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c10: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1c20: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
1c30: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1c40: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1c50: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1c70: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1c80: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1c90: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1ca0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
1cb0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61  = *ppIter;.    a
1cc0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 45 78 63  ssert( pBt->pExc
1cd0: 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74  lusive==0 || pBt
1ce0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c  ->pExclusive==pL
1cf0: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
1d00: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1d10: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
1d20: 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b   *ppIter = pLock
1d30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1d40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
1d50: 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
1d60: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
1d70: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1d80: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
1d90: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70  t->pExclusive==p
1da0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 45 78   ){.    pBt->pEx
1db0: 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d  clusive = 0;.  }
1dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1dd0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1de0: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
1df0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
1e00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1e10: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
1e20: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
1e30: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
1e40: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
1e50: 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
1e60: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64  tShared.*/.#ifnd
1e70: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
1e80: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
1e90: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
1ea0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1eb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ec0: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
1ed0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
1ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
1f00: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1f10: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f20: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
1f30: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
1f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
1f50: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1f60: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
1f70: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1f80: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f90: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
1fa0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
1fb0: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
1fc0: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
1fd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
1fe0: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
1ff0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2000: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
2010: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
2020: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
2030: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
2040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2050: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
2060: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
2070: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
2080: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
2090: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20a0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
20b0: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
20c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
20d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
20e0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
20f0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
2100: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
2110: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
2120: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
2130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
2140: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
2150: 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(x).#endif../*.
2160: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
2170: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2180: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
2190: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
21a0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
21b0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
21c0: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
21d0: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
21e0: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
21f0: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
2200: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2210: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2220: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2230: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2240: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
2250: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
2260: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
2270: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2280: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
2290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22a0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
22b0: 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a   &pCur->nKey);..
22c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
22d0: 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c  an intKey table,
22e0: 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20   then the above 
22f0: 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79  call to BtreeKey
2300: 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72  Size().  ** stor
2310: 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  es the integer k
2320: 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ey in pCur->nKey
2330: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2340: 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a  his value is.  *
2350: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
2360: 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73  quired. Otherwis
2370: 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f  e, if pCur is no
2380: 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  t open on an int
2390: 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  Key.  ** table, 
23a0: 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63  then malloc spac
23b0: 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20  e for and store 
23c0: 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  the pCur->nKey b
23d0: 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a  ytes of key .  *
23e0: 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  * data..  */.  i
23f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2400: 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50   && 0==pCur->apP
2410: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b  age[0]->intKey){
2420: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
2430: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2440: 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  pCur->nKey);.   
2450: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
2460: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2470: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
2480: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65   pCur->nKey, pKe
2490: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
24a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24b0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
24c0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
24d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
24f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2510: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2520: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2530: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
2540: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
2550: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
2560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2570: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
2580: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2590: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
25a0: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
25b0: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
25c0: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43  ge[i]);.      pC
25d0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
25e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  0;.    }.    pCu
25f0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
2600: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2610: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
2620: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
2630: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2640: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
2650: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2660: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2670: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
2680: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
2690: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
26a0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
26b0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
26c0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
26d0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
26e0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
26f0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
2700: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
2710: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
2720: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
2730: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2740: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2750: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2760: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
2770: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
2780: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
2790: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
27b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
27c0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
27d0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
27e0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
27f0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2800: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2810: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2820: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2830: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2840: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
2850: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
2860: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
2870: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
2880: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
2890: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
28a0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
28b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
28f0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2900: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2920: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
2930: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2940: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2950: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2960: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
2970: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2980: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
2990: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
29a0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29b0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
29c0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
29d0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
29e0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
29f0: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
2a00: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
2a10: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2a20: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
2a30: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
2a40: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
2a50: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
2a60: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
2a70: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
2a80: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
2a90: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
2aa0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
2ab0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2ac0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
2ad0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
2ae0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2af0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
2b00: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2b10: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
2b20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b30: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
2b40: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2b50: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2b60: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b70: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2b80: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
2b90: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ba0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2bb0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2bc0: 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  kip;.  }.  pCur-
2bd0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2be0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
2bf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2c00: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
2c10: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
2c20: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2c30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2c40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2c50: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2c60: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
2c70: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
2c80: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2c90: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ca0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2cb0: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2cc0: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2cd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2ce0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2cf0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
2d00: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
2d10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
2d20: 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  \.         sqlit
2d30: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2d40: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2d50: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2d60: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
2d70: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2d80: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
2d90: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
2da0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
2db0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
2dc0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 20 63  ed at.  Cursor c
2dd0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
2de0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
2df0: 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20  inting.** at is 
2e00: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
2e10: 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a   under them..**.
2e20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e30: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2e40: 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69   code if somethi
2e50: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
2e60: 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a  The.** integer *
2e70: 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74  pHasMoved is set
2e80: 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63   to one if the c
2e90: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2ea0: 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f  and 0 if not..*/
2eb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ec0: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
2ed0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2ee0: 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b  int *pHasMoved){
2ef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2f00: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2f10: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2f20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f30: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
2f40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f50: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2f60: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f70: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69  LID || pCur->ski
2f80: 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61  p!=0 ){.    *pHa
2f90: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
2fa0: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
2fb0: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
2fc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2fe0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2ff0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
3000: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
3010: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
3020: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
3030: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
3040: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
3050: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
3060: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
3070: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
3080: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
3090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
30a0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
30b0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
30c0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
30d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
30e0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
30f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3100: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3110: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
3120: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
3130: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
3140: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
3150: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
3160: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
3170: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
3180: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
3190: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
31a0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31b0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
31c0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
31d0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
31e0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
31f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
3200: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3210: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
3220: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3230: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
3240: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
3250: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
3260: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
3270: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
3280: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
3290: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
32a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
32b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
32c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
32d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
32e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
32f0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
3300: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
3310: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
3320: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
3330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
3340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
3360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
3370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
3380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
3390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
33a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
33b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
33c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
33d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
33e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
33f0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3400: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3410: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3420: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3430: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3440: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3450: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3460: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3470: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
3480: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
3490: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
34a0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
34b0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
34c0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
34d0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
34e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3500: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3510: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3520: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3530: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3540: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3550: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3560: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3570: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
3580: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
3590: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
35a0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
35b0: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
35c0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
35d0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
35e0: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
35f0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
3600: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
3610: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
3620: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
3630: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
3640: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
3650: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
3660: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
3670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
3680: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
3690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
36a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
36c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
36d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
36e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
36f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
3700: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
3710: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
3720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3730: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
3740: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
3750: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
3760: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
3770: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
3780: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3790: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
37a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
37b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
37c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
37d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
37e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
37f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
3800: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
3810: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
3820: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
3830: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
3840: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
3850: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
3860: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
3870: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
3880: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
3890: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
38a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
38b0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
38c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38d0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
38e0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
38f0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
3900: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
3910: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
3920: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
3930: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
3940: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
3950: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
3960: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3970: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3980: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
3990: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
39a0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
39b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
39c0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
39d0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
39e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
39f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
3a00: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
3a10: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
3a20: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
3a30: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
3a40: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
3a50: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
3a60: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
3a70: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
3a80: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
3a90: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
3aa0: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
3ab0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3ac0: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
3ad0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
3ae0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
3af0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
3b00: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
3b10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
3b20: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
3b30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
3b40: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
3b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3b60: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
3b70: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
3b80: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
3b90: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
3ba0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
3bb0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
3bc0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 79   ptrmapPutOvfl(y
3bd0: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  ,z) SQLITE_OK.#e
3be0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
3bf0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
3c00: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
3c10: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
3c20: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
3c30: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
3c40: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
3c50: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
3c60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3c70: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
3c80: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
3c90: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3ca0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
3cb0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
3cc0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3cd0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
3ce0: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
3cf0: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
3d00: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
3d10: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
3d20: 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66  Data[(P)->cellOf
3d30: 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a  fset+2*(I)])))..
3d40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
3d50: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
3d60: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
3d70: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
3d80: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
3d90: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3da0: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
3db0: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
3dc0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
3dd0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
3de0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
3df0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
3e00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3e10: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3e20: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3e30: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
3e40: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
3e50: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
3e60: 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65    struct _OvflCe
3e70: 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70  ll *pOvfl;.    p
3e80: 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61  Ovfl = &pPage->a
3e90: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d  Ovfl[i];.    k =
3ea0: 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20   pOvfl->idx;.   
3eb0: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
3ec0: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
3ed0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
3ee0: 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65  eturn pOvfl->pCe
3ef0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
3f00: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
3f10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
3f20: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3f30: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
3f40: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
3f50: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
3f60: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
3f70: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
3f80: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
3f90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
3fa0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69   function.  sqli
3fb0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3fc0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
3fd0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
3fe0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
3ff0: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  t and sqlite3Btr
4000: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
4010: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
4020: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
4030: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
4040: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
4050: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
4060: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
4070: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
4080: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
4090: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73   instead of.** s
40a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
40b0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
40c0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
40d0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
40e0: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
40f0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4100: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
4110: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
4120: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
4130: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
4140: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
4150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
4160: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
4170: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
4180: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4190: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
41a0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
41b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  /.){.  int n;   
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
41e0: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
41f0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
4200: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
4210: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4220: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
4230: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
4240: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4250: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
4260: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
4270: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
4280: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
4290: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
42a0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
42b0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
42c0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
42d0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
42e0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
42f0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
4300: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
4310: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
4320: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61        n += getVa
4330: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
4340: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
4350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
4360: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
4370: 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  }.    n += getVa
4380: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
4390: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
43a0: 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ey);.    pInfo->
43b0: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
43c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
43d0: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b  Info->nData = 0;
43e0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
43f0: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
4400: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
4410: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
4420: 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49  ayload;.  }.  pI
4430: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
4440: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
4450: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
4460: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
4470: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
4480: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
4490: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
44a0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
44b0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
44c0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
44d0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
44e0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
44f0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4500: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4510: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
4520: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
4530: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
4540: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
4550: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
4560: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
4570: 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f  >nLocal = nPaylo
4580: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
4590: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
45a0: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
45b0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
45c0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
45d0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
45e0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
45f0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4600: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4610: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4620: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4630: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4640: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4650: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4660: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4670: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
4680: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
4690: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
46a0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
46b0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
46c0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
46d0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
46e0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
46f0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4700: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4710: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4720: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4730: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4740: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4750: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4760: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4770: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
4780: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
4790: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
47a0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
47b0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
47c0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
47d0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
47e0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
47f0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4800: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4810: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4820: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4830: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4840: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4850: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4860: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4870: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
4880: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
4890: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
48a0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
48b0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
48c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
48d0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
48e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
48f0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4900: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4910: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4920: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4930: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4940: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4950: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4960: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4970: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
4980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4990: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
49a0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
49b0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
49c0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
49d0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
49e0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
49f0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4a00: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4a10: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4a20: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4a30: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4a40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4a50: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4a60: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4a70: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
4a80: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4a90: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
4aa0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
4ab0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
4ac0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
4ad0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4af0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4b00: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4b10: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4b20: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4b30: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4b40: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4b50: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4b60: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4b70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
4b80: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
4b90: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
4ba0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
4bb0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
4bc0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
4bd0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4be0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4bf0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4c00: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4c10: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4c20: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4c30: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4c40: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4c50: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4c60: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4c70: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
4c80: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
4c90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4ca0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
4cb0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4cc0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4cd0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4ce0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4cf0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4d00: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36  endif.static u16
4d10: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4d20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4d30: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4d40: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4d50: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4d60: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4d70: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
4d80: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
4d90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4da0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
4db0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
4dc0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
4dd0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4de0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4df0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4e00: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4e10: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4e20: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4e30: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4e40: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4e50: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4e60: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4e70: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4e80: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
4e90: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
4ea0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ell!=0 );.  sqli
4eb0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4ec0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4ed0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
4ee0: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
4ef0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4f00: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
4f10: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
4f20: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
4f30: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4f40: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
4f50: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
4f60: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4f70: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4f80: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4f90: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
4fa0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
4fb0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
4fc0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
4fd0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
4fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4ff0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
5000: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
5010: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
5020: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
5030: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
5040: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
5050: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
5060: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
5070: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
5080: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
5090: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
50a0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
50b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
50c0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
50d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
50e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
50f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5100: 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   );.  pCell = fi
5110: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
5120: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
5130: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
5140: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
5150: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
5160: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
5170: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
5180: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
5190: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
51a0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
51b0: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
51c0: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
51d0: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
51e0: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
51f0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5200: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
5210: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
5220: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
5230: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
5240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5250: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
5260: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
5270: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5290: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
52a0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52c0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
52d0: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
52e0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
52f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5300: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
5310: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
5320: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
5330: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
5340: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5350: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
5360: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
5370: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
5380: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5390: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
53a0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
53b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
53c0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
53d0: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
53e0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
53f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
5400: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
5410: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
5420: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5440: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5450: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5460: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
5470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5480: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5490: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
54a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
54b0: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
54c0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
54d0: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
54e0: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
54f0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
5500: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
5510: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
5520: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5530: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5540: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5550: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
5560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5570: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5580: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
5590: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
55a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
55b0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
55c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
55d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
55e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
55f0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
5600: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
5610: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
5620: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
5630: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
5640: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
5650: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
5660: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5670: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
5680: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
5690: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
56a0: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
56b0: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
56c0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
56d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
56e0: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
56f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5700: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
5710: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
5720: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
5730: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
5740: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
5770: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
5780: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
5790: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
57a0: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
57b0: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
57c0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
57d0: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73  e(pAddr);.    as
57e0: 73 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e  sert( pc<pPage->
57f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
5800: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
5810: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
5820: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
5830: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
5840: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5850: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
5860: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
5870: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
5880: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
5890: 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  ( cbrk>=cellOffs
58a0: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
58b0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
58c0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
58d0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
58e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
58f0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
5900: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
5910: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
5920: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
5930: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72  ta[addr], 0, cbr
5940: 6b 2d 61 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  k-addr);.}../*.*
5950: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
5960: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
5970: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
5980: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
5990: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
59a0: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
59b0: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
59c0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
59d0: 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  .  The caller gu
59e0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
59f0: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a  ere is enough.**
5a00: 20 73 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f   space.  This ro
5a10: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72  utine will never
5a20: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
5a30: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
5a40: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
5a50: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
5a60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
5a70: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
5a80: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
5a90: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
5aa0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
5ab0: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65  ** calls defrage
5ac0: 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f  mentPage() to co
5ad0: 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72  nsolidate all fr
5ae0: 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ee space before 
5af0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74  .** allocating t
5b00: 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f  he new chunk..*/
5b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
5b20: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
5b30: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
5b40: 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  yte){.  int addr
5b50: 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74  , pc, hdr;.  int
5b60: 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72   size;.  int nFr
5b70: 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20  ag;.  int top;. 
5b80: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
5b90: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  t cellOffset;.  
5ba0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5bb0: 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d  ata;.  .  data =
5bc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
5bd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5be0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5bf0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5c10: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
5c20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5c30: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
5c40: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5c50: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
5c60: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
5c70: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
5c80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
5c90: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
5ca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5cb0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
5cc0: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  0 );.  pPage->nF
5cd0: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
5ce0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
5cf0: 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67  Offset;..  nFrag
5d00: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
5d10: 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29    if( nFrag<60 )
5d20: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
5d30: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
5d40: 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20  king for a slot 
5d50: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
5d60: 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a  tisfy the.    **
5d70: 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20   space request. 
5d80: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64  */.    addr = hd
5d90: 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  r+1;.    while( 
5da0: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
5db0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
5dc0: 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  {.      size = g
5dd0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
5de0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
5df0: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
5e00: 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c         if( size<
5e10: 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20  nByte+4 ){.     
5e20: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
5e30: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
5e40: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
5e50: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
5e60: 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e  nFrag + size - n
5e70: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Byte;.          
5e80: 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20  return pc;.     
5e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ea0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
5eb0: 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e  ta[pc+2], size-n
5ec0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
5ed0: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a   return pc + siz
5ee0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5ef0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5f00: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
5f10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
5f20: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
5f30: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
5f40: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
5f50: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
5f60: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
5f70: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
5f80: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
5f90: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5fa0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
5fb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
5fc0: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
5fd0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
5fe0: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
5ff0: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
6000: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
6010: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
6020: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
6030: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 74 6f  e(pPage);.    to
6040: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6050: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a  ta[hdr+5]);.  }.
6060: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
6070: 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66    assert( cellOf
6080: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c  fset + 2*nCell <
6090: 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62  = top );.  put2b
60a0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
60b0: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
60c0: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
60d0: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
60e0: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
60f0: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
6100: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
6110: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
6120: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
6130: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
6140: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
6150: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
6160: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
6170: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
6180: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
6190: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
61a0: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
61b0: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
61c0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
61d0: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
61e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
61f0: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
6200: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
6210: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
6220: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
6230: 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65  , hdr;.  unsigne
6240: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
6250: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
6260: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
6270: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
6280: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
6290: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
62a0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
62b0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
62c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
62d0: 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
62e0: 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  :4) );.  assert(
62f0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
6300: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
6310: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
6320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6330: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
6340: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6350: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
6360: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
6370: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
6380: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6390: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
63a0: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
63b0: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
63c0: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
63d0: 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c  n the SECURE_DEL
63e0: 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  ETE .  ** option
63f0: 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63   is enabled at c
6400: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20  ompile-time */. 
6410: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74   memset(&data[st
6420: 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a  art], 0, size);.
6430: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
6440: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
6450: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
6460: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
6470: 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  ks */.  hdr = pP
6480: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
6490: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
64a0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
64b0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
64c0: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
64d0: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
64e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
64f0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
6500: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
6510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
6520: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
6530: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
6540: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
6550: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
6560: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
6570: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
6580: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
6590: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
65a0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
65b0: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
65c0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
65d0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
65e0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
65f0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
6600: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a  ge->nFree += siz
6610: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
6620: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
6630: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
6640: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6650: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
6660: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
6670: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6680: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
6690: 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20  pnext, psize;.  
66a0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
66b0: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
66c0: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
66d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
66e0: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
66f0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
6700: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
6710: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
6720: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6730: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
6740: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
6750: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
6760: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
6770: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
6780: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
6790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72        assert( fr
67a0: 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e  ag<=data[pPage->
67b0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a  hdrOffset+7] );.
67c0: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
67d0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
67e0: 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75  = frag;.      pu
67f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6800: 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26  gin], get2byte(&
6810: 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20  data[pnext]));. 
6820: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
6830: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70  ata[pbegin+2], p
6840: 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64  next+get2byte(&d
6850: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62  ata[pnext+2])-pb
6860: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  egin);.    }else
6870: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  {.      addr = p
6880: 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begin;.    }.  }
6890: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
68a0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
68b0: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72  begins with a fr
68c0: 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20  eeblock, remove 
68d0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74  it. */.  if( dat
68e0: 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68  a[hdr+1]==data[h
68f0: 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64  dr+5] && data[hd
6900: 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36  r+2]==data[hdr+6
6910: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70  ] ){.    int top
6920: 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67  ;.    pbegin = g
6930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
6940: 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+1]);.    memcp
6950: 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  y(&data[hdr+1], 
6960: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32  &data[pbegin], 2
6970: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
6980: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6990: 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  5]);.    put2byt
69a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
69b0: 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26  top + get2byte(&
69c0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29  data[pbegin+2]))
69d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
69e0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
69f0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
6a00: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
6a10: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
6a20: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
6a30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
6a40: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
6a50: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
6a60: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
6a70: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
6a80: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
6a90: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
6aa0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
6ab0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
6ac0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
6ad0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6ae0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
6af0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
6b00: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
6b10: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
6b20: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6b30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6b40: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6b50: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6b70: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
6b80: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
6b90: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
6ba0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
6bb0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
6bc0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
6bd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
6be0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
6bf0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
6c00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6c20: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6c30: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6c40: 3e 6c 65 61 66 20 3d 20 66 6c 61 67 42 79 74 65  >leaf = flagByte
6c50: 3e 3e 33 3b 20 20 61 73 73 65 72 74 28 20 50 54  >>3;  assert( PT
6c60: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
6c70: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
6c80: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
6c90: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
6ca0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
6cb0: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
6cc0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
6cd0: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
6ce0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
6cf0: 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  EY) ){.    pPage
6d00: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
6d10: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6d20: 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   = pPage->leaf;.
6d30: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
6d40: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
6d50: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
6d60: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6d70: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
6d80: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
6d90: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
6da0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6db0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
6dc0: 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  hasData = 0;.   
6dd0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6de0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
6df0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
6e00: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
6e10: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
6e20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6e30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6e40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6e50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6e60: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
6e70: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
6e80: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
6e90: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
6ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
6eb0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
6ec0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
6ed0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
6ee0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
6ef0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
6f00: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
6f10: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
6f20: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
6f30: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
6f40: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
6f50: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
6f60: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
6f70: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
6f80: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
6f90: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
6fa0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
6fb0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6fc0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
6fd0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
6fe0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
6ff0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
7000: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7010: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7020: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7040: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
7050: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
7060: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7070: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
7080: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
7090: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
70a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
70b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
70c0: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
70d0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
70e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
70f0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
7100: 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  nit ){.    int p
7110: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
7120: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
7130: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
7140: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
7150: 0a 20 20 20 20 69 6e 74 20 68 64 72 3b 20 20 20  .    int hdr;   
7160: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
7170: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
7180: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
7190: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
71a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
71b0: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
71c0: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
71d0: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
71e0: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
71f0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7200: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
7210: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
7220: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
7230: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
7240: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
7250: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
7260: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
7270: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
7280: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
7290: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
72a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
72b0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
72c0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
72d0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
72e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
72f0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
7300: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20  ent area */..   
7310: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
7320: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
7330: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7340: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
7350: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
7360: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
7370: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
7380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7390: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
73a0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
73b0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
73c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32  Bt->pageSize<=32
73d0: 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65  768 );.    pPage
73e0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
73f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
7400: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
7410: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
7420: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
7430: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
7440: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
7450: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
7460: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
7470: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
7480: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
7490: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
74a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
74b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
74c0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
74d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
74e0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
74f0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
7500: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
7510: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
7520: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
7530: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7540: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7550: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  BKPT;.    }.  . 
7560: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
7570: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
7580: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
7590: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
75a0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
75b0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
75c0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
75d0: 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b   - (cellOffset +
75e0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29   2*pPage->nCell)
75f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
7600: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
7610: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
7620: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
7630: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ze-4 ){.        
7640: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
7650: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
7660: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7670: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7680: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
7690: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
76a0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
76b0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
76c0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
76d0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ]);.      if( ne
76e0: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
76f0: 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20  +size+3 ){.     
7700: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
7710: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
7720: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
7730: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
7740: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7750: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
7760: 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65     nFree += size
7770: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
7780: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  t;.    }.    pPa
7790: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
77a0: 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  e;.    if( nFree
77b0: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
77c0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70        /* Free sp
77d0: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
77e0: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
77f0: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
7800: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7810: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 0a 23  _BKPT; .    }..#
7820: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
7830: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
7840: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
7850: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
7860: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
7870: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
7880: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
7890: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
78a0: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
78b0: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
78c0: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
78d0: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
78e0: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
78f0: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
7900: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
7910: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
7920: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
7930: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
7940: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
7950: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
7960: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
7970: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
7980: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
7990: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
79a0: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
79b0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
79c0: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
79d0: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
79e0: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
79f0: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
7a00: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
7a10: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
7a20: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
7a30: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
7a40: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
7a50: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
7a60: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
7a70: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
7a80: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
7a90: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
7aa0: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
7ab0: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
7ac0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7ad0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ae0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
7af0: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
7b00: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
7b10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7b20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
7b30: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
7b40: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
7b50: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
7b60: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
7b70: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
7b80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
7b90: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
7ba0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
7bb0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
7bc0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
7bd0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
7be0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
7bf0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20  >pBt;.  int hdr 
7c00: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7c10: 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b  et;.  int first;
7c20: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7c30: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
7c40: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
7c50: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
7c60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7c70: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7c80: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7c90: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
7ca0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
7cb0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7cc0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
7cd0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
7ce0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7cf0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
7d00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7d10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7d20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7d30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7d40: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
7d50: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
7d60: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
7d70: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
7d80: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
7d90: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
7da0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
7db0: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
7dc0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
7dd0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
7de0: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
7df0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
7e00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
7e10: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
7e20: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7e30: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
7e40: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7e50: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
7e60: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
7e70: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
7e80: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
7e90: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7ea0: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
7eb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
7ec0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
7ed0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
7ee0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
7ef0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
7f00: 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   - 1;.  pPage->n
7f10: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
7f20: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
7f30: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
7f40: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
7f50: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
7f60: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
7f70: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
7f80: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
7f90: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
7fa0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
7fb0: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
7fc0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
7fd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
7fe0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7ff0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
8000: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8010: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
8020: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
8030: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8040: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
8050: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
8060: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
8070: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
8080: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
8090: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
80a0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
80b0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
80c0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
80d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
80e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
80f0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
8100: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
8110: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
8120: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
8130: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
8140: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
8150: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
8160: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
8170: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
8180: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
8190: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
81a0: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
81b0: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
81c0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
81d0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
81e0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
81f0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
8200: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
8210: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
8220: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
8230: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
8240: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
8250: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
8260: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
8270: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
8280: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
8290: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
82a0: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
82b0: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
82c0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
82d0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
82e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
82f0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
8300: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
8310: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
8320: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
8330: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
8340: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
8350: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
8360: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
8370: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
8380: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
8390: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
83a0: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
83b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
83c0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
83d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
83e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
83f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
8400: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
8410: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
8420: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
8430: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
8440: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
8450: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8460: 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
8470: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
8480: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
8490: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
84a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
84b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
84c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
84d0: 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
84e0: 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69    Or return -1 i
84f0: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e  f.** there is an
8500: 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e  y kind of error.
8510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8520: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
8530: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8540: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
8550: 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  age;.  rc = sqli
8560: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
8570: 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
8580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  );.  return (rc=
8590: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67 65  =SQLITE_OK?nPage
85a0: 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  :-1);.}../*.** G
85b0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
85c0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
85d0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
85e0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
85f0: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
8600: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
8610: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
8620: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
8630: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
8640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
8650: 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  tPage()..*/.stat
8660: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
8670: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
8680: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
8690: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
86a0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
86b0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
86c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
86d0: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
86e0: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
86f0: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
8700: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
8710: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
8720: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
8730: 70 44 62 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  pDbPage;.  MemPa
8740: 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
8750: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8760: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8770: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
8780: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
8790: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
87a0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
87b0: 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20   /* It is often 
87c0: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
87d0: 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20 69  e page we want i
87e0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
87f0: 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20  he..  ** If so, 
8800: 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e  get it directly.
8810: 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73 20    This saves us 
8820: 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63  from having to c
8830: 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61  all.  ** pagerPa
8840: 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b  gecount() to mak
8850: 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77  e sure pgno is w
8860: 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68  ithin limits, wh
8870: 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  ich results.  **
8880: 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c   in a measureabl
8890: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  e performance im
88a0: 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  provements..  */
88b0: 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
88c0: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
88d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
88e0: 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
88f0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  e ){.    /* Page
8900: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63   is already in c
8910: 61 63 68 65 20 2a 2f 0a 20 20 20 20 2a 70 70 50  ache */.    *ppP
8920: 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62 74  age = pPage = bt
8930: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
8940: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
8950: 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
8960: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
8970: 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20  se{.    /* Page 
8980: 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41  not in cache.  A
8990: 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20  cquire it. */.  
89a0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
89b0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
89c0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
89d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
89e0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
89f0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
8a00: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
8a10: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
8a20: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
8a30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
8a40: 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61     pPage = *ppPa
8a50: 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ge;.  }.  if( !p
8a60: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
8a70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8a80: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
8a90: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
8aa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8ab0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
8ac0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70  (pPage);.    *pp
8ad0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
8ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8af0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
8b00: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
8b10: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
8b20: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
8b30: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  r.** call to sql
8b40: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
8b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8b60: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
8b70: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8b80: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
8b90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ba0: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
8bb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
8bc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8bd0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
8be0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
8bf0: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
8c00: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
8c10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
8c20: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
8c30: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
8c40: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
8c50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8c60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8c70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
8c80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8c90: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
8ca0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
8cb0: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
8cc0: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
8cd0: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
8ce0: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
8cf0: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
8d00: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
8d10: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
8d20: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
8d30: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
8d40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
8d50: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
8d60: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
8d70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
8d80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8d90: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
8da0: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
8db0: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
8dc0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
8dd0: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
8de0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
8df0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
8e00: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
8e10: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
8e20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8e30: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8e40: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8e50: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
8e60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8e70: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
8e80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8e90: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8ea0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8eb0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
8ec0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
8ed0: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
8ee0: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
8ef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
8f00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
8f10: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
8f20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
8f30: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
8f40: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
8f50: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8f60: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
8f70: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
8f80: 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42  Arg, int n){.  B
8f90: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
8fa0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
8fb0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
8fc0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
8fd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8fe0: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
8ff0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
9000: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
9010: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
9020: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
9030: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
9040: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
9050: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
9060: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
9070: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9080: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
9090: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
90a0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
90b0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
90c0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
90d0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
90e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
90f0: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
9100: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
9110: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
9120: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
9130: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
9140: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
9150: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
9160: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
9170: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
9180: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
9190: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
91a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
91b0: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
91c0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
91d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
91e0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
91f0: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
9200: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
9210: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
9220: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
9230: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
9240: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
9250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
9260: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
9270: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
9280: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
9290: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
92a0: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
92b0: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
92c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
92d0: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
92e0: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
92f0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
9300: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
9310: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
9320: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
9330: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
9340: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
9350: 3b 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64  ;      /* Shared
9360: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
9370: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
9380: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
9390: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
93a0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
93b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
93c0: 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  K;.  int nReserv
93d0: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
93e0: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
93f0: 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  ];..  /* Set the
9400: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
9410: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
9420: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
9430: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
9440: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
9450: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
9460: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
9470: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
9480: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
9490: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
94a0: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
94b0: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
94c0: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
94d0: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
94e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
94f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
9500: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
9510: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
9520: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
9530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9540: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
9550: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
9560: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
9570: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
9580: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
9590: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
95a0: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
95b0: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
95c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
95d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
95e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
95f0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
9600: 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66    pVfs = db->pVf
9610: 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  s;.  p = sqlite3
9620: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
9630: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
9640: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
9650: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9660: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
9670: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
9680: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69   p->db = db;..#i
9690: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
96a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
96b0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
96c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
96d0: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
96e0: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
96f0: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
9700: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
9710: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
9720: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
9730: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
9740: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
9750: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  h.  */.  if( isM
9760: 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 64  emdb==0.   && (d
9770: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9780: 45 5f 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26  E_Vtab)==0.   &&
9790: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
97a0: 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a  ilename[0].  ){.
97b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
97c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
97d0: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
97f0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
9800: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
9810: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
9820: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
9830: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
9840: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
9850: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
9860: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
9870: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
9880: 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  1;.      db->fla
9890: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61  gs |= SQLITE_Sha
98a0: 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20  redCache;.      
98b0: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
98c0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
98d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
98e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
98f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9900: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9910: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
9920: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
9930: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
9940: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
9950: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
9960: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
9970: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
9980: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
9990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
99a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
99b0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
99c0: 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
99d0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
99e0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
99f0: 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
9a00: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
9a10: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
9a20: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
9a30: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
9a40: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
9a50: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
9a60: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
9a90: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
9aa0: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
9ab0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
9ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
9ad0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
9ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9af0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9b00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9b10: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
9b20: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
9b30: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
9b40: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
9b50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9b60: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
9b70: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
9b80: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
9b90: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
9ba0: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
9bb0: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
9bc0: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
9bd0: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
9be0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
9bf0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
9c00: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
9c10: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
9c20: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
9c30: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
9c40: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
9c50: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
9c60: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
9c70: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
9c80: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
9c90: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
9ca0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
9cb0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
9cc0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9cd0: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
9ce0: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
9cf0: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
9d00: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
9d10: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
9d20: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
9d30: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
9d40: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
9d50: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
9d60: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
9d70: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
9d80: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
9d90: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
9da0: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
9db0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
9dc0: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
9dd0: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
9de0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
9df0: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
9e00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9e10: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
9e20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9e30: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
9e40: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
9e50: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
9e60: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
9e70: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
9e80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9ea0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
9eb0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
9ec0: 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46   pBt->busyHdr.xF
9ed0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
9ee0: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
9ef0: 6c 65 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75  ler;.    pBt->bu
9f00: 73 79 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74  syHdr.pArg = pBt
9f10: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
9f20: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
9f30: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
9f40: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
9f70: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
9f80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9f90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9fa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9fb0: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
9fc0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
9fd0: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
9fe0: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
9ff0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
a000: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a010: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
a020: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
a030: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
a040: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
a050: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75  pPager, &pBt->bu
a060: 73 79 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70  syHdr);.    p->p
a070: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
a080: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
a090: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
a0a0: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
a0b0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
a0c0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
a0d0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
a0e0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
a0f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
a100: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
a110: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
a120: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
a130: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
a140: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
a150: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
a160: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
a170: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
a180: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
a190: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
a1a0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
a1b0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
a1c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
a1d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
a1e0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a1f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
a200: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69  t->pageSize);.#i
a210: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a220: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
a230: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
a240: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
a250: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
a260: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
a270: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
a280: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
a290: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
a2a0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
a2b0: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
a2c0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
a2d0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
a2e0: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
a2f0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
a300: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
a310: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
a320: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
a330: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
a340: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
a350: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
a360: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
a370: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
a380: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
a390: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
a3a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a3b0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
a3c0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
a3d0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
a3e0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
a3f0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
a400: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
a410: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
a420: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
a430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
a440: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
a450: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
a460: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
a470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
a480: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
a490: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
a4a0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
a4b0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
a4c0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a4d0: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
a4e0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
a4f0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
a500: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
a510: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
a520: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
a530: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
a540: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
a550: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
a560: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
a570: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
a580: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
a590: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
a5a0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
a5b0: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
a5c0: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
a5d0: 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Size */.    sqli
a5e0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a5f0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
a600: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
a610: 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ;.   .#if !defin
a620: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a630: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
a640: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a650: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
a660: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
a670: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
a680: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
a690: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
a6a0: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
a6b0: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
a6c0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a6d0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a6e0: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
a6f0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
a700: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
a710: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a720: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a730: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
a740: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
a750: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
a760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a770: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
a780: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
a790: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
a7a0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
a7b0: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
a7c0: 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
a7d0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a7e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
a7f0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
a800: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a810: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
a820: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
a830: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
a840: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a850: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a860: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
a870: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
a880: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
a890: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
a8a0: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
a8b0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
a8c0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
a8d0: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
a8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
a8f0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
a900: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
a910: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
a920: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a930: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a940: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a950: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
a960: 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
a970: 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
a980: 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
a990: 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
a9a0: 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
a9b0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
a9c0: 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
a9d0: 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
a9e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
a9f0: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
aa00: 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
aa10: 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
aa20: 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
aa30: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
aa40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
aa50: 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
aa60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
aa70: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
aa80: 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
aa90: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
aaa0: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
aab0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
aac0: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
aad0: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
aae0: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
aaf0: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
ab00: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
ab10: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
ab20: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
ab30: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
ab40: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
ab50: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
ab60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ab70: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
ab80: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
ab90: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
aba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
abb0: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
abc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
abd0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
abe0: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
abf0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
ac00: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
ac10: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
ac20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ac30: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
ac40: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
ac50: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
ac60: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
ac70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
ac80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ac90: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
aca0: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
acb0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
acc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
acd0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
ace0: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
acf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ad00: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
ad10: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
ad20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ad30: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
ad40: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
ad50: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
ad60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ad70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
ad80: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
ad90: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
ada0: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
adb0: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
adc0: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
add0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
ade0: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
adf0: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
ae00: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
ae10: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
ae20: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
ae30: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
ae40: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
ae50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ae60: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
ae70: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
ae80: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
ae90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
aea0: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
aeb0: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
aec0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
aed0: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
aee0: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
aef0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
af00: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
af10: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
af20: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
af30: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
af40: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
af50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
af60: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
af70: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
af80: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
af90: 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
afa0: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
afb0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
afc0: 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
afd0: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
afe0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
aff0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
b000: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
b010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b020: 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
b030: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
b040: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
b050: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
b060: 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
b070: 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
b080: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
b090: 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
b0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b0b0: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
b0c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
b0d0: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
b0e0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
b0f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
b100: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
b110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
b120: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
b130: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
b140: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
b150: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
b160: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
b180: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
b190: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
b1a0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
b1b0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
b1c0: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
b1d0: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
b1e0: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
b1f0: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
b200: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
b210: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
b220: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
b230: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
b240: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
b250: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
b260: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
b270: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
b280: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
b290: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
b2a0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
b2b0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
b2c0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
b2d0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
b2e0: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
b2f0: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
b300: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
b310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b320: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
b330: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
b340: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
b350: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b360: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
b370: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b380: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
b390: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
b3a0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
b3b0: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
b3c0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
b3d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b3e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
b3f0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
b400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
b410: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
b420: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72   = p->db;.  pCur
b430: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
b440: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
b450: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
b460: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
b470: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
b480: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
b490: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
b4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
b4b0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
b4c0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
b4d0: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
b4e0: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
b4f0: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
b500: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
b510: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
b520: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
b530: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
b540: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
b550: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
b560: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
b570: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
b580: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
b590: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b5a0: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
b5b0: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
b5c0: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
b5d0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
b5e0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
b5f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
b600: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
b610: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
b620: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
b630: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
b640: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
b650: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
b660: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
b670: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
b680: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
b690: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
b6a0: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
b6b0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
b6c0: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
b6d0: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
b6e0: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
b6f0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
b700: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
b710: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
b720: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b730: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
b740: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
b750: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
b760: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
b770: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
b780: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
b790: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
b7a0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
b7b0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
b7c0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
b7d0: 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
b7e0: 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
b7f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b800: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
b810: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
b820: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
b830: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b840: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
b850: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b860: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
b870: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
b880: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
b890: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
b8a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
b8b0: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
b8c0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
b8d0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
b8e0: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
b8f0: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
b900: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b910: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
b920: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b930: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b940: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
b950: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b960: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
b970: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
b980: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b990: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
b9a0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
b9b0: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
b9c0: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b9d0: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b9e0: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b9f0: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
ba00: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
ba10: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
ba20: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
ba30: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
ba40: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
ba50: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
ba60: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
ba70: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
ba80: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
ba90: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
baa0: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
bab0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
bac0: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
bad0: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
bae0: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
baf0: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
bb00: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
bb10: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
bb20: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
bb30: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
bb40: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
bb50: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
bb60: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
bb70: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
bb80: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
bb90: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
bba0: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
bbb0: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
bbc0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
bbd0: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
bbe0: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
bbf0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
bc00: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
bc10: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
bc20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
bc30: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
bc40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bc50: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
bc60: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
bc70: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
bc80: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
bc90: 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
bca0: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
bcb0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
bcc0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
bcd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bce0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
bcf0: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
bd00: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
bd10: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
bd20: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
bd30: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
bd40: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
bd50: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
bd60: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
bd70: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
bd80: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
bd90: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
bda0: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
bdb0: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
bdc0: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
bdd0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
bde0: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
bdf0: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
be00: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
be10: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
be20: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
be30: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
be40: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
be50: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
be60: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
be70: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
be80: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
be90: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
bea0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
beb0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
bec0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
bed0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
bee0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
bef0: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
bf00: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
bf10: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
bf20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bf30: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
bf40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
bf50: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bf60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
bf70: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
bf80: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
bf90: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
bfa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bfb0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
bfc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
bfd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
bfe0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
bff0: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
c000: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
c010: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
c020: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
c030: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
c040: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
c050: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
c060: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
c070: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
c080: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
c090: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c0a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
c0b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c0c0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
c0d0: 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
c0e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
c100: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
c110: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c120: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
c130: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
c140: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c150: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c160: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
c170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
c180: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
c190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c1a0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
c1b0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
c1c0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
c1d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
c1e0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
c1f0: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
c200: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
c210: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
c220: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
c230: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
c240: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
c250: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
c260: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
c270: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
c280: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
c290: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
c2a0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
c2b0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
c2c0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
c2d0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
c2e0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
c2f0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
c300: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
c310: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
c320: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
c330: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
c340: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
c350: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
c360: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
c370: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
c380: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
c390: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
c3a0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
c3b0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
c3c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
c3d0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
c3e0: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
c3f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
c400: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
c410: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
c420: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
c430: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
c440: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c450: 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
c460: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
c470: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c480: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
c490: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
c4a0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
c4b0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c4c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c4d0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
c4e0: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
c4f0: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
c500: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
c510: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
c520: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ze;.  }.  if( pa
c530: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
c540: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
c550: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
c560: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
c570: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
c580: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
c590: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
c5a0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
c5b0: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
c5c0: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
c5d0: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
c5e0: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
c5f0: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
c600: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
c610: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c620: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c630: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
c640: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
c650: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c660: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c670: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71  - nReserve;.  sq
c680: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c690: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c6b0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
c6c0: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
c6d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c6e0: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
c6f0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
c700: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
c710: 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Size;.}.int sqli
c720: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
c730: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
c740: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c750: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c760: 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
c770: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
c780: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
c790: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c7a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c7c0: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
c7d0: 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
c7e0: 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
c7f0: 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
c800: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
c810: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
c820: 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
c830: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
c840: 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
c850: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
c860: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
c870: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c880: 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
c890: 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
c8a0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
c8b0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c8c0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c8d0: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
c8e0: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
c8f0: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
c900: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c910: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c920: 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
c930: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c940: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
c950: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
c960: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
c970: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
c980: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
c990: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
c9a0: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
c9b0: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
c9c0: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
c9d0: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
c9e0: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
c9f0: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
ca00: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
ca10: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
ca20: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
ca30: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
ca40: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
ca50: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
ca60: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
ca70: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ca80: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
ca90: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
caa0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
cab0: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
cac0: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
cad0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
cae0: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
caf0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
cb00: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
cb10: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
cb20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cb30: 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75  ;.  int av = (au
cb40: 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a  toVacuum?1:0);..
cb50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
cb60: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
cb70: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
cb80: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
cb90: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
cba0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
cbb0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
cbc0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
cbd0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
cbe0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
cbf0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
cc00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cc10: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
cc20: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
cc30: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
cc40: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
cc50: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
cc60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
cc70: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
cc80: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
cc90: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
cca0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
ccb0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ccc0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
ccd0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
cce0: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
ccf0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
cd00: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
cd10: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
cd20: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
cd30: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
cd40: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
cd50: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
cd60: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
cd70: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
cd80: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
cd90: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
cda0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
cdb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
cdc0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
cdd0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
cde0: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
cdf0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
ce00: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
ce10: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
ce20: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
ce30: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
ce40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
ce50: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
ce60: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
ce70: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
ce80: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
ce90: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
cea0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ceb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
cec0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
ced0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
cee0: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
cef0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
cf00: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
cf10: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
cf20: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
cf30: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
cf40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
cf50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
cf60: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
cf70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cf80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cf90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
cfa0: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
cfb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cfc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
cfd0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
cfe0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
cff0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d000: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d010: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
d020: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
d030: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
d040: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
d050: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
d060: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d070: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d080: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
d090: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
d0a0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
d0b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d0c0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d0d0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
d0e0: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
d0f0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
d100: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
d110: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
d120: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
d130: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
d140: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
d150: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
d160: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
d170: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
d180: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d190: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d1a0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
d1b0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
d1c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
d1d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d1e0: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
d1f0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
d200: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
d210: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
d220: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
d230: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
d240: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
d250: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
d260: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
d270: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
d280: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
d290: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
d2a0: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
d2b0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
d2c0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
d2d0: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
d2e0: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
d2f0: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
d300: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
d310: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
d320: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
d330: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
d340: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
d350: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
d360: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d370: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d380: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
d390: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
d3a0: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
d3b0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
d3c0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
d3d0: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
d3e0: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
d3f0: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
d400: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
d410: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d420: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
d430: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d440: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d450: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
d460: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
d470: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d480: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
d490: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
d4a0: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
d4b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
d4c0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
d4d0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d4e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
d4f0: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
d500: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
d510: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
d520: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
d530: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
d540: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
d550: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
d560: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
d570: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
d580: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
d590: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
d5a0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d5b0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
d5c0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
d5d0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
d5e0: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
d5f0: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
d600: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
d610: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d620: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
d630: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
d640: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
d650: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d660: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
d670: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
d680: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
d690: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
d6a0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
d6b0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
d6c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d6d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
d6e0: 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
d6f0: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
d700: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d710: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d720: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d730: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
d740: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
d750: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
d760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d770: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
d780: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
d790: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d7a0: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
d7b0: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
d7c0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
d7d0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d7e0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
d7f0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
d800: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
d810: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
d820: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
d830: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
d840: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
d850: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
d860: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
d870: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
d880: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
d890: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
d8a0: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
d8b0: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
d8c0: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
d8d0: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
d8e0: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
d8f0: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
d900: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
d910: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
d920: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
d930: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
d940: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
d950: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
d960: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
d970: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d980: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
d990: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
d9a0: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
d9b0: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
d9c0: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
d9d0: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
d9e0: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
d9f0: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
da00: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
da10: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
da20: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
da30: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
da40: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
da50: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
da60: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
da70: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
da80: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
da90: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
daa0: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  32/255 - 23;.  p
dab0: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
dac0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
dad0: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
dae0: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
daf0: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
db00: 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28   - 23;.  assert(
db10: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
db20: 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
db30: 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
db40: 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
db50: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
db60: 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
db70: 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
db80: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
db90: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
dba0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
dbb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
dbc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
dbd0: 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65  ke lockBtree() e
dbe0: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c  xcept that it al
dbf0: 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  so invokes the.*
dc00: 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  * busy callback 
dc10: 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b  if there is lock
dc20: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a   contention..*/.
dc30: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
dc40: 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74  treeWithRetry(Bt
dc50: 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e  ree *pRef){.  in
dc60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dc70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
dc80: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
dc90: 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69  tex(pRef) );.  i
dca0: 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73  f( pRef->inTrans
dcb0: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
dcc0: 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63      u8 inTransac
dcd0: 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74  tion = pRef->pBt
dce0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  ->inTransaction;
dcf0: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
dd00: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72  ity(pRef);.    r
dd10: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
dd20: 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c  BeginTrans(pRef,
dd30: 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70   0);.    pRef->p
dd40: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
dd50: 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f  n = inTransactio
dd60: 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54  n;.    pRef->inT
dd70: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
dd80: 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  E;.    if( rc==S
dd90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dda0: 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72    pRef->pBt->nTr
ddb0: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
ddc0: 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65   }.    btreeInte
ddd0: 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d  grity(pRef);.  }
dde0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ddf0: 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49         ../*.** I
de00: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
de10: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
de20: 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
de30: 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
de40: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
de50: 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
de60: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
de70: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
de80: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
de90: 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
dea0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
deb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
dec0: 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
ded0: 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
dee0: 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
def0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
df00: 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61  e are any outsta
df10: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74  nding cursors, t
df20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
df30: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
df40: 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
df50: 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
df60: 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
df70: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
df80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
df90: 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
dfa0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
dfb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dfc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
dfd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
dfe0: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
dff0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
e000: 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f  E && pBt->pCurso
e010: 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61  r==0 && pBt->pPa
e020: 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ge1!=0 ){.    if
e030: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
e040: 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
e050: 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20  er)>=1 ){.      
e060: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
e070: 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69  ge1->aData );.#i
e080: 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70 42  f 0.      if( pB
e090: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
e0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
e0b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
e0c0: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
e0d0: 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
e0e0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
e0f0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
e100: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
e110: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
e120: 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  t;.        pPage
e130: 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  ->pgno = 1;.    
e140: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
e150: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
e160: 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  ->pPage1);.    }
e170: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
e180: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
e190: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nStmt = 0;.  }.}
e1a0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
e1b0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
e1c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
e1d0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
e1e0: 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
e1f0: 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
e200: 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
e210: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
e220: 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
e230: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
e240: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
e250: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
e260: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e270: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
e280: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e290: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
e2a0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
e2b0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
e2c0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
e2d0: 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
e2e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
e2f0: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
e300: 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
e310: 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
e320: 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
e330: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
e340: 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
e350: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
e360: 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
e370: 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
e380: 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
e390: 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
e3a0: 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
e3b0: 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
e3c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e3d0: 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
e3e0: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
e3f0: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
e400: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
e410: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
e420: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
e430: 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
e440: 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
e450: 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
e460: 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
e470: 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
e480: 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
e490: 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
e4a0: 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
e4b0: 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
e4c0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
e4d0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
e4e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e4f0: 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
e500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
e510: 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
e520: 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
e530: 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
e540: 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
e550: 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
e560: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
e570: 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
e580: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
e590: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
e5a0: 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
e5b0: 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
e5c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
e5d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e5e0: 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
e5f0: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
e600: 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
e610: 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
e620: 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
e630: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
e640: 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
e650: 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
e660: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
e670: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e680: 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
e690: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
e6a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e6b0: 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
e6c0: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
e6d0: 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
e6e0: 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
e6f0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
e700: 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
e710: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
e720: 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
e730: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
e740: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
e750: 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
e760: 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
e770: 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
e780: 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
e790: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
e7a0: 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
e7b0: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
e7c0: 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
e7d0: 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
e7e0: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
e7f0: 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
e800: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
e810: 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
e820: 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
e830: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
e840: 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
e850: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
e860: 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
e870: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
e880: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
e890: 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
e8a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
e8b0: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
e8c0: 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
e8d0: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
e8e0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
e8f0: 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
e900: 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
e910: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e920: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
e930: 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
e940: 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
e950: 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
e960: 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
e970: 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
e980: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
e990: 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
e9a0: 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
e9b0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
e9c0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
e9d0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
e9e0: 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
e9f0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
ea00: 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
ea10: 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
ea20: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
ea30: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
ea40: 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
ea50: 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
ea60: 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
ea70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
ea80: 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
ea90: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
eaa0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
eab0: 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
eac0: 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
ead0: 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
eae0: 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
eaf0: 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
eb00: 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
eb10: 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
eb20: 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
eb30: 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
eb40: 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
eb50: 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
eb60: 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
eb70: 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
eb80: 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
eb90: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
eba0: 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
ebb0: 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
ebc0: 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
ebd0: 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
ebe0: 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
ebf0: 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
ec00: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
ec10: 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
ec20: 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
ec30: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
ec40: 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
ec50: 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
ec60: 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
ec70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ec80: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
ec90: 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
eca0: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
ecb0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ecc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ecd0: 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
ece0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
ecf0: 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
ed00: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
ed10: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
ed20: 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
ed30: 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
ed40: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
ed50: 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
ed60: 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
ed70: 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
ed80: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
ed90: 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
eda0: 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
edb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
edc0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
edd0: 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
ede0: 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
edf0: 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
ee00: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
ee10: 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
ee20: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
ee30: 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
ee40: 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
ee50: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
ee60: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
ee70: 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
ee80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
ee90: 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
eea0: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
eeb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74   }..  /* If anot
eec0: 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
eed0: 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
eee0: 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
eef0: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
ef00: 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
ef10: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
ef20: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
ef30: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
ef40: 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
ef50: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
ef60: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
ef70: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
ef80: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
ef90: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
efa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
efb0: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  SY;.    goto tra
efc0: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
efd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
efe0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
eff0: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
f000: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
f010: 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
f020: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
f030: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
f040: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
f050: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
f060: 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
f070: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
f080: 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  Y;.        goto 
f090: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
f0a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
f0b0: 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20  endif..  do {.  
f0c0: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
f0d0: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f  1==0 ){.      do
f0e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  {.        rc = l
f0f0: 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
f100: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74       }while( pBt
f110: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72  ->pPage1==0 && r
f120: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
f130: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
f140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f150: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
f160: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
f170: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
f180: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
f190: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
f1a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f1b0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
f1c0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
f1d0: 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  age, wrflag>1);.
f1e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
f1f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f200: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
f210: 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
f220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f230: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
f240: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f250: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
f260: 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
f270: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
f280: 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
f290: 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
f2a0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
f2b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
f2c0: 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
f2d0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
f2e0: 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
f2f0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
f300: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
f310: 74 2c 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20  t, 0) );..  if( 
f320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f330: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
f340: 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
f350: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
f360: 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20  ransaction++;.  
f370: 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
f380: 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
f390: 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
f3a0: 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
f3b0: 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
f3c0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
f3d0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
f3e0: 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
f3f0: 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
f400: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f410: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
f420: 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
f430: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
f440: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
f450: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45  );.      pBt->pE
f460: 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20  xclusive = p;.  
f470: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f480: 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
f490: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
f4a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
f4b0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
f4c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e  urn rc;.}...#ifn
f4d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f4e0: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
f4f0: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
f500: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
f510: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
f520: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
f530: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
f540: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
f550: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
f560: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
f570: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
f580: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f590: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
f5a0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
f5b0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
f5c0: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
f5d0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f5e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
f610: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
f620: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f640: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
f650: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
f660: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f690: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
f6a0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
f6b0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
f6c0: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
f6d0: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
f6e0: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
f6f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f700: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f710: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f720: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
f730: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
f740: 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
f750: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f760: 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
f770: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f780: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
f790: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
f7b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
f7c0: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
f7d0: 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
f7e0: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
f7f0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
f800: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
f810: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f820: 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
f830: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f840: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f850: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
f860: 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
f870: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
f880: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
f890: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
f8a0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
f8b0: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
f8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
f8d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
f8e0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f8f0: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
f900: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
f910: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
f920: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
f930: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
f940: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
f950: 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
f960: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
f970: 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
f980: 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
f990: 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
f9a0: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
f9b0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
f9c0: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
f9d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f9e0: 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
f9f0: 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
fa00: 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
fa10: 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
fa20: 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
fa30: 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
fa40: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
fa50: 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
fa60: 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
fa70: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
fa80: 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
fa90: 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
faa0: 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
fab0: 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
fac0: 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
fad0: 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
fae0: 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
faf0: 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
fb00: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
fb10: 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
fb20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fb30: 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
fb40: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
fb50: 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
fb60: 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
fb70: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
fb80: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
fb90: 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
fba0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
fbb0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
fbc0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
fbd0: 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
fbe0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
fbf0: 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
fc00: 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
fc10: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
fc20: 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
fc50: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
fc60: 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
fc70: 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
fc80: 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
fc90: 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
fca0: 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
fcb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fcc0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fcd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fce0: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
fcf0: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
fd00: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
fd10: 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
fd20: 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
fd30: 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
fd40: 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
fd50: 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
fd60: 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
fd70: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
fd80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fd90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
fda0: 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
fdb0: 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
fdc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
fdd0: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
fde0: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
fdf0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
fe00: 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
fe10: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
fe20: 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
fe30: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
fe40: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
fe50: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
fe60: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
fe70: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
fe80: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
fe90: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
fea0: 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
feb0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
fec0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fed0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
fee0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
fef0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
ff00: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
ff10: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
ff20: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
ff30: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ff40: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
ff50: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
ff60: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ff70: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
ff80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
ff90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
ffa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ffb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffc0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
ffd0: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
ffe0: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
fff0: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
10000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10020 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
10030 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
10040 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
10050 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
10060 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
10070 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
10080 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
10090 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
100a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
100b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
100c0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
100d0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
100e0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
100f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
10100 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
10110 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
10120 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
10130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10140 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
10150 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
10160 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
10170 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
10180 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
10190 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
101a0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
101b0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
101c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
101d0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
101e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
101f0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
10200 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
10210 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
10220 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
10230 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
10240 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10250 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
10260 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
10270 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
10280 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
10290 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
102a0 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
102b0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
102c0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
102d0 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
102e0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
102f0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
10300 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
10310 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  ommit.){.  MemPa
10320 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
10330 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
10340 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
10350 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
10360 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
10370 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
10380 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
10390 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
103a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
103b0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
103c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
103d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
103e0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
103f0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
10400 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
10410 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
10420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10440 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10450 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
10460 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
10470 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
10480 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
10490 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
104a0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
104b0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
104c0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
104d0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
104e0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
104f0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
10500 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
10510 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
10520 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
10530 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
10540 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
10550 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
10560 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
10570 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
10580 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
105a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
105b0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
105c0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
105d0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
105e0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
105f0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
10600 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
10610 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
10620 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
10630 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
10640 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
10650 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
10660 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
10670 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
10680 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
10690 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
106a0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
106b0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
106c0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
106d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
106e0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
106f0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
10700 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
10710 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
10720 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
10730 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
10740 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
10750 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
10760 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
10770 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
10780 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
10790 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
107a0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
107b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
107c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
107d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
107e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
107f0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
10800 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
10810 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
10820 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
10830 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
10840 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
10850 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
10860 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
10870 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
10880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
108a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
108b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
108c0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
108d0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
108e0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
108f0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
10900 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
10910 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
10920 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
10930 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
10940 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
10950 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
10960 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
10970 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
10980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10990 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
109a0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
109b0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
109c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
109d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
109e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
109f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
10a00 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
10a10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
10a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10a30 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10a40 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
10a50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10a60 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
10a70 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
10a80 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
10a90 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
10aa0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
10ab0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
10ac0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10ae0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
10af0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
10b00 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
10b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
10b30 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
10b40 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
10b50 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
10b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
10b70 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
10b80 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
10b90 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
10ba0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
10bb0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
10bc0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
10bd0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
10be0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
10bf0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
10c00 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
10c10 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
10c20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
10c30 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
10c40 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
10c50 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
10c60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
10c70 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
10c80 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
10c90 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
10ca0 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
10cb0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
10cc0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
10cd0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
10ce0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
10cf0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
10d00 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
10d10 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
10d20 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
10d30 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
10d40 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
10d50 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
10d60 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
10d70 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
10d80 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
10d90 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
10da0 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
10db0 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
10dc0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
10dd0 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
10de0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
10df0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
10e00 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
10e10 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
10e20 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
10e30 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
10e40 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
10e50 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50  ){.  Pgno iLastP
10e60 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
10e70 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74  * Last page in t
10e80 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
10e90 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
10ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10eb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
10ec0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
10ed0 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
10ee0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10ef0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10f00 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d  ) );.  iLastPg =
10f10 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
10f20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29  if( iLastPg==0 )
10f30 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20  {.    iLastPg = 
10f40 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
10f50 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
10f60 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
10f70 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
10f80 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
10f90 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
10fa0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
10fb0 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
10fc0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
10fd0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
10fe0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
10ff0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
11000 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
11010 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
11020 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50   || nFin==iLastP
11030 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
11040 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
11050 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
11060 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
11070 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
11080 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
11090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
110b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
110c0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
110d0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
110e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
110f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11100 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
11110 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
11120 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
11130 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
11140 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
11150 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
11160 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
11170 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
11180 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
11190 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
111a0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
111b0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
111c0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
111d0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
111e0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
111f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
11200 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
11210 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
11220 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
11230 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
11240 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
11250 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11260 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
11270 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
11280 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
11290 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
112a0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
112b0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
112c0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
112d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
112e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
112f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11300 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11310 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
11320 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
11330 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
11340 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
11350 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
11360 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
11370 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
11380 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11390 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
113a0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
113b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
113c0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
113d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
113e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
113f0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
11400 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
11410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11420 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11430 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11440 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
11450 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
11460 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
11470 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
11480 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
11490 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
114a0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
114b0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
114c0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
114d0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
114e0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
114f0 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
11500 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
11510 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
11520 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
11530 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
11540 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
11550 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
11560 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
11570 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
11580 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
11590 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
115a0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
115b0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
115c0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
115d0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
115e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
115f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11610 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
11620 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
11630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
11650 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
11660 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
11670 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
11680 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
11690 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
116a0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
116b0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
116c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
116d0 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
116e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
116f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11700 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
11710 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
11720 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
11730 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
11740 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
11750 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
11760 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
11770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
117a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
117b0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
117c0 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77  iLastPg - 1;.  w
117d0 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e  hile( pBt->nTrun
117e0 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  c==PENDING_BYTE_
117f0 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
11800 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
11810 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20  t->nTrunc) ){.  
11820 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b    pBt->nTrunc--;
11830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11850 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
11860 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
11870 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
11880 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
11890 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
118a0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
118b0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
118c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
118d0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
118e0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
118f0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
11900 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
11910 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
11920 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
11930 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
11940 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
11950 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
11960 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  occured,.** SQLI
11970 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11980 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
11990 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
119a0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
119b0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
119c0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
119d0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
119e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
119f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
11a00 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
11a10 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  >db = p->db;.  a
11a20 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
11a30 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11a40 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
11a50 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
11a60 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
11a70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
11a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
11a90 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
11aa0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
11ab0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
11ac0 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
11ad0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
11ae0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
11af0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11b10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11b20 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
11b30 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
11b40 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
11b50 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
11b60 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
11b70 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
11b80 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
11b90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11ba0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
11bb0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
11bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
11bd0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
11be0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
11bf0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
11c00 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
11c10 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
11c20 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
11c30 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
11c40 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
11c50 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
11c60 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
11c70 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
11c80 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
11c90 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
11ca0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70  ed *pBt, Pgno *p
11cb0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
11cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11cd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
11ce0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
11cf0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
11d00 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
11d10 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
11d20 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
11d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d40 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11d50 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
11d60 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
11d70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
11d80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
11d90 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
11da0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
11db0 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20  no nFin = 0;..  
11dc0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
11dd0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67  c==0 ){.      Pg
11de0 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20  no nFree;.      
11df0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20  Pgno nPtrmap;.  
11e00 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
11e10 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  sz = pBt->pageSi
11e20 7a 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f  ze;.      int nO
11e30 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  rig = pagerPagec
11e40 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
11e50 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54  );..      if( PT
11e60 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
11e70 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20   nOrig) ){.     
11e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11e90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11eb0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
11ec0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
11ed0 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d  {.        nOrig-
11ee0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11ef0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
11f00 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
11f10 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
11f20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
11f30 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
11f40 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
11f50 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  g)+pgsz/5)/(pgsz
11f60 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20  /5);.      nFin 
11f70 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
11f80 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20  - nPtrmap;.     
11f90 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
11fa0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11fb0 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
11fc0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11fd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
11fe0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
11ff0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
12000 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
12010 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
12020 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
12030 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
12040 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
12050 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
12060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12070 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
12080 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
12090 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
120a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
120b0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73  DONE ){.      as
120c0 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20  sert(nFin==0 || 
120d0 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c  pBt->nTrunc==0 |
120e0 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72  | nFin<=pBt->nTr
120f0 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  unc);.      rc =
12100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12110 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
12120 63 20 26 26 20 6e 46 69 6e 20 29 7b 0a 20 20 20  c && nFin ){.   
12130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12140 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
12150 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
12160 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
12170 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
12180 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
12190 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
121a0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
121b0 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
121c0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75         pBt->nTru
121d0 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  nc = nFin;.     
121e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
121f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12200 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
12210 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
12220 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
12230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54  E_OK ){.    *pnT
12250 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75  runc = pBt->nTru
12260 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72  nc;.    pBt->nTr
12270 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  unc = 0;.  }.  a
12280 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c  ssert( nRef==sql
12290 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
122a0 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
122b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
122c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
122d0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
122e0 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
122f0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
12300 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
12310 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
12320 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
12330 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
12340 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
12350 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
12360 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
12370 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
12380 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
12390 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
123a0 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
123b0 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
123c0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
123d0 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
123e0 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
123f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
12400 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
12420 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
12430 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
12440 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
12450 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
12460 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
12470 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
12480 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
12490 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
124a0 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
124b0 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
124c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
124d0 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
124e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
124f0 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
12500 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
12510 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
12520 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
12530 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
12540 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
12550 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
12560 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66  3BtreeCommit() f
12570 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
12580 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
12590 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
125a0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
125b0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
125c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
125d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
125e0 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
125f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
12600 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
12610 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
12620 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
12630 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
12640 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
12650 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
12660 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
12670 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
12680 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
12690 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
126a0 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
126b0 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
126c0 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
126d0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
126e0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
126f0 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
12700 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
12710 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
12720 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
12730 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
12740 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
12750 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
12760 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
12770 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
12780 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
12790 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
127a0 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
127b0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
127c0 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
127d0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
127e0 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
127f0 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
12800 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
12810 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
12820 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
12830 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
12840 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
12850 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12860 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
12870 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
12880 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
12890 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
128a0 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  .    Pgno nTrunc
128b0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
128c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
128d0 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d      pBt->db = p-
128e0 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
128f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12900 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
12910 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
12920 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
12930 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20  cuumCommit(pBt, 
12940 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20  &nTrunc); .     
12950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
12970 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12980 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
12990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
129a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
129b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
129c0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
129d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
129e0 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29  ster, nTrunc, 0)
129f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
12a00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
12a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12a20 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
12a30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
12a40 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
12a50 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
12a60 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
12a70 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
12a80 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
12a90 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
12aa0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
12ab0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
12ac0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
12ad0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
12ae0 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
12af0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
12b00 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
12b10 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
12b20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
12b30 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
12b40 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
12b50 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
12b60 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
12b70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
12b80 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
12b90 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
12ba0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
12bb0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12bc0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
12bd0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
12be0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
12bf0 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
12c00 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
12c10 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
12c20 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
12c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
12c40 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
12c50 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
12c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12c70 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
12c80 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
12c90 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
12ca0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
12cb0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
12cc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12cd0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
12ce0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12cf0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
12d00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12d10 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
12d20 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74  ->db;.  btreeInt
12d30 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
12d40 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
12d50 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
12d60 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
12d70 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
12d80 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
12d90 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
12da0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
12db0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
12dc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
12dd0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
12de0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
12df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
12e00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12e10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
12e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
12e30 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
12e40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
12e50 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
12e60 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
12e70 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
12e80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12e90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12ea0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
12eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12ec0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
12ed0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
12ee0 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e  _READ;.    pBt->
12ef0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
12f00 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
12f10 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  s(p);..  /* If t
12f20 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e  he handle has an
12f30 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
12f40 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
12f50 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61  ement the transa
12f60 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
12f70 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
12f80 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
12f90 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72  nsaction count r
12fa0 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20  eaches 0, set.  
12fb0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ** the shared st
12fc0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
12fd0 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
12fe0 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c  eeIfUnused() cal
12ff0 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c  l below.  ** wil
13000 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
13010 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
13020 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
13030 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74  _NONE ){.    pBt
13040 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
13050 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
13060 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
13070 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
13080 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
13090 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
130a0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
130b0 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74   handles current
130c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
130d0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
130e0 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a   and unlock.  **
130f0 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68   the pager if th
13100 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
13110 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
13120 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13130 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54  n..  */.  p->inT
13140 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
13150 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  E;.  unlockBtree
13160 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
13170 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13180 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
13190 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
131a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
131b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
131c0 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
131d0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
131e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
131f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13200 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
13210 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
13220 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13230 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
13240 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
13250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13270 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
13280 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (p);.  }.  sqlit
13290 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
132a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
132b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
132c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
132d0 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
132e0 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
132f0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
13300 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
13310 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
13320 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
13330 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
13340 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
13350 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
13360 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
13370 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
13380 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75  tine, a write-cu
13390 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
133a0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
133b0 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67  pable of writing
133c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
133d0 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65    That means the
133e0 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f   cursor was.** o
133f0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
13400 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64   for writing and
13410 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
13420 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a  not be disabled.
13430 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73  ** by having its
13440 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74   state changed t
13450 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a  o CURSOR_FAULT..
13460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
13470 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
13480 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13490 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
134a0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
134b0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
134c0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
134d0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
134e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
134f0 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65  rFlag && pCur->e
13500 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
13510 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
13520 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
13530 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
13540 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
13550 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
13560 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
13570 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
13580 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
13590 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
135a0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
135b0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
135c0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
135d0 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
135e0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
135f0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
13600 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
13610 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
13620 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
13630 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
13640 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
13650 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13660 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
13670 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
13680 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
13690 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
136a0 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
136b0 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
136c0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
136d0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
136e0 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
136f0 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
13700 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
13710 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
13720 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
13730 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
13740 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
13750 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
13760 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
13770 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
13780 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
13790 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
137a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
137b0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
137c0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
137d0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
137e0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
137f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13800 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
13810 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
13820 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
13830 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
13840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
13850 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
13860 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
13870 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
13880 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65  ->skip = errCode
13890 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
138a0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
138b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
138c0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
138d0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
138e0 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
138f0 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
13900 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
13910 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
13920 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
13930 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
13940 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
13950 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
13960 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
13970 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
13980 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
13990 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
139a0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
139b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
139c0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
139d0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
139e0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
139f0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
13a00 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
13a10 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
13a20 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
13a30 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
13a40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
13a50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
13a60 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
13a70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
13a80 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
13a90 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
13aa0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
13ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ac0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13ad0 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
13ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
13af0 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
13b00 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
13b10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
13b20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
13b30 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
13b40 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
13b50 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
13b60 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
13b70 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
13b80 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
13b90 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
13ba0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
13bb0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
13bc0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
13bd0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
13be0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
13bf0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
13c00 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
13c10 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
13c20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
13c30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
13c40 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
13c50 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
13c60 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
13c70 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
13c80 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
13c90 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
13ca0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
13cb0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
13cc0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
13cd0 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
13ce0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
13cf0 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
13d00 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
13d10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13d20 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
13d30 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
13d40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13d50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13d60 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
13d70 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
13d80 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
13d90 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
13da0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
13db0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
13dc0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
13dd0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
13de0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
13df0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
13e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
13e10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
13e20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
13e30 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
13e40 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
13e50 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  ** call sqlite3B
13e60 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
13e70 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
13e80 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
13e90 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
13ea0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
13eb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
13ec0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13ed0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
13ee0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
13ef0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
13f00 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13f10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13f20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
13f30 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
13f40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13f50 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
13f60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
13f70 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13f80 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
13f90 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
13fa0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
13fb0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
13fc0 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
13fd0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
13fe0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13ff0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14000 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
14010 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
14020 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14030 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
14040 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
14050 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
14060 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14070 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
14080 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
140a0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
140b0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
140c0 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
140d0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
140e0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
140f0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
14100 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
14110 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
14120 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
14130 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
14140 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
14150 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
14160 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
14170 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
14180 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
14190 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
141a0 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
141b0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
141c0 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
141d0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
141e0 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
141f0 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
14200 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
14210 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
14220 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
14230 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
14240 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
14250 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
14260 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
14270 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
14280 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
14290 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
142a0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
142b0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
142c0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
142d0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
142e0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
142f0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
14300 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
14310 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
14320 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
14330 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
14340 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
14350 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
14360 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
14370 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
14380 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
14390 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
143a0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
143b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
143c0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
143d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
143e0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
143f0 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21  if( (p->inTrans!
14400 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
14410 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a   pBt->inStmt ){.
14420 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
14430 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
14440 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
14450 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
14460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14470 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14480 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
14490 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
144a0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
144b0 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67  _OK : sqlite3Pag
144c0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d  erStmtBegin(pBt-
144d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
144e0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20  t->inStmt = 1;. 
144f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
14500 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
14520 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61  * Commit the sta
14530 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  tment subtransac
14540 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
14550 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20  n progress.  If 
14560 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63  no.** subtransac
14570 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
14580 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
14590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
145a0 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42  treeCommitStmt(B
145b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
145c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
145d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
145e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
145f0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
14600 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
14610 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
14620 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
14630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14640 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
14650 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14660 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
14670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14680 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
14690 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
146a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
146b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
146c0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74  Rollback the act
146d0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  ive statement su
146e0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49  btransaction.  I
146f0 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74  f no subtransact
14700 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65  ion.** is active
14710 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14720 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
14730 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
14740 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
14750 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
14760 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a  n.  Any attempt.
14770 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  ** to use a curs
14780 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
14790 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
147a0 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
147b0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75  ion.** will resu
147c0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
147d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
147e0 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
147f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
14800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14820 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
14830 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14840 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14850 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d  ->db;.  if( pBt-
14860 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d  >inStmt && !pBt-
14870 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14890 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70  erStmtRollback(p
148a0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
148b0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
148c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
148d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
148e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
148f0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
14900 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
14910 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
14920 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
14930 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20  ** iTable.  The 
14940 61 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67  act of acquiring
14950 20 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61   a cursor gets a
14960 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a   read lock on .*
14970 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14980 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ile..**.** If wr
14990 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
149a0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
149b0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
149c0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
149d0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
149e0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
149f0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
14a00 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
14a10 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
14a20 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
14a30 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
14a40 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
14a50 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
14a60 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
14a70 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
14a80 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
14a90 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
14aa0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
14ab0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
14ac0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
14ad0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
14ae0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14af0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
14b00 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
14b10 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
14b20 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
14b30 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
14b40 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
14b50 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
14b60 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
14b70 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
14b80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
14b90 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
14ba0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
14bb0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
14bc0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
14bd0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
14be0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
14bf0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
14c00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14c10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
14c20 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
14c30 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
14c40 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
14c50 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
14c60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
14c70 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
14c80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
14c90 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
14ca0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
14cb0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
14cc0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
14cd0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
14ce0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
14cf0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
14d00 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
14d10 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
14d20 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
14d30 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
14d40 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
14d50 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79  eCursorSize() by
14d60 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a  tes of memory .*
14d70 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
14d80 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a  pCur have been z
14d90 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c  eroed by the cal
14da0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
14db0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
14dc0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14df0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
14e00 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
14e30 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
14e40 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
14e70 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
14e80 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
14e90 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
14ea0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
14eb0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
14ec0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
14ed0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
14ee0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
14f10 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
14f20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
14f30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14f40 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
14f50 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
14f60 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
14f70 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
14f80 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
14f90 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ly ){.      retu
14fa0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
14fb0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
14fc0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
14fd0 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 30  (p, iTable, 0, 0
14fe0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
14ff0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
15000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15010 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
15020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63   ){.    rc = loc
15030 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
15040 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
15050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15060 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15070 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
15080 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46  >readOnly && wrF
15090 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lag ){.      ret
150a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
150b0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  NLY;.    }.  }. 
150c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
150d0 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
150e0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
150f0 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  && pagerPagecoun
15100 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
15110 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
15120 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
15130 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
15140 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
15150 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
15160 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
15170 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
15180 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
15190 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
151a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
151b0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
151c0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
151d0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
151e0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
151f0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
15200 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
15210 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
15220 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
15230 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
15240 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
15250 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
15260 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
15270 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15280 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
15290 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
152a0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
152b0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
152c0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
152d0 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
152e0 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
152f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
15300 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
15310 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
15320 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
15330 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
15340 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
15350 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
15360 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
15370 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75  INVALID;..  retu
15380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
15390 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
153a0 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73  eption:.  releas
153b0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
153c0 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ge[0]);.  unlock
153d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
153e0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
153f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
15400 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
15410 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15440 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
15450 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15470 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
15480 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
15490 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
154a0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
154d0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
154e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
154f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
15520 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
15530 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15560 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
15570 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
15580 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15590 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
155a0 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
155b0 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
155c0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
155d0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
155e0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
155f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15600 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15610 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
15620 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b  reeCursorSize(){
15630 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
15640 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a  (BtCursor);.}...
15650 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
15660 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
15670 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15680 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
15690 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
156a0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
156b0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
156c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
156d0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
156e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
156f0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
15700 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
15710 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
15720 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
15730 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
15740 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
15750 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
15760 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  );.    pBt->db =
15770 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20   pBtree->db;.   
15780 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
15790 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
157a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
157b0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
157c0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
157d0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
157e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
157f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
15800 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15810 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
15820 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
15830 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
15840 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
15850 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15860 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
15870 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
15880 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
15890 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
158a0 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
158b0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
158c0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
158d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
158e0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
158f0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
15900 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
15910 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
15920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15940 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72  ** Make a tempor
15950 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69  ary cursor by fi
15960 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65  lling in the fie
15970 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e  lds of pTempCur.
15980 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72  .** The temporar
15990 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  y cursor is not 
159a0 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69  on the cursor li
159b0 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65  st for the Btree
159c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
159d0 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
159e0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
159f0 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
15a00 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69  empCur){.  int i
15a10 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
15a20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15a30 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  r) );.  memcpy(p
15a40 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73  TempCur, pCur, s
15a50 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
15a60 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
15a70 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
15a80 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
15a90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54    for(i=0; i<=pT
15aa0 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  empCur->iPage; i
15ab0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
15ac0 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
15ad0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
15ae0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15af0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15b00 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15b10 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15b20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15b30 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15b40 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15b50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15b60 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
15b70 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
15b80 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
15b90 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
15ba0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15bb0 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  r) );.  for(i=0;
15bc0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
15bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
15be0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
15bf0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
15c00 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15c10 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15c20 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
15c30 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
15c40 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
15c50 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
15c60 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
15c70 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
15c80 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
15c90 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15ca0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
15cb0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
15cc0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
15cd0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
15ce0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
15cf0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
15d00 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
15d10 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
15d20 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
15d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15d40 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
15d50 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
15d60 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
15d70 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
15d80 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
15d90 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
15da0 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
15db0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
15dc0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
15dd0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
15de0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
15df0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
15e00 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
15e10 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
15e20 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
15e30 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
15e40 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
15e50 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
15e60 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
15e70 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
15e80 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
15e90 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
15ea0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
15eb0 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
15ec0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
15ed0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
15ee0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
15ef0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
15f00 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
15f10 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
15f20 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
15f30 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
15f40 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
15f50 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
15f60 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
15f70 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
15f80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
15f90 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
15fa0 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
15fb0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
15fc0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
15fd0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
15fe0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
15ff0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
16000 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
16010 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
16020 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
16030 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
16040 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
16050 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
16060 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
16070 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
16080 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
16090 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
160a0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
160b0 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
160c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
160d0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
160e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
160f0 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ge;.      sqlite
16100 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
16110 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
16120 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
16130 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
16140 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
16150 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
16160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16170 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
16180 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
16190 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
161a0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
161b0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
161c0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
161d0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
161e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
161f0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
16200 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
16210 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
16250 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
16260 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
162a0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
162b0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
162f0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
16300 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
16310 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
16320 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
16330 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
16340 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
16350 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
16390 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
163e0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
163f0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16430 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
16440 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
16450 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
16460 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
16470 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
16480 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
16490 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
164a0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
164b0 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
164c0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
164d0 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
164e0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
164f0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
16500 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
16510 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
16520 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
16530 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
16540 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
16550 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
16560 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
16570 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
16580 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
16590 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
165a0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
165b0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
165c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
165d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
165e0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
165f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
16600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16610 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
16620 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
16630 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
16640 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
16650 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
16660 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
16670 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
16680 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70  ALID ){.      *p
16690 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
166a0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
166b0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
166c0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
166d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
166e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
166f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16700 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
16710 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16720 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
16730 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
16740 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
16750 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20  nts to.  Always 
16760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16770 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  ..** Failure is 
16780 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  not possible.  I
16790 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
167a0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  not currently.**
167b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20   pointing to an 
167c0 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e  entry (which can
167d0 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
167e0 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20  mple, if.** the 
167f0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
16800 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69  y) then *pSize i
16810 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  s set to 0..*/.i
16820 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
16830 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
16840 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
16850 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
16860 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
16870 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
16880 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
16890 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
168a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
168b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
168d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
168e0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
168f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16900 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
16910 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16920 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
16930 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f  .      /* Not po
16940 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
16950 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70  d entry - set *p
16960 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20  Size to 0. */.  
16970 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
16980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16990 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
169a0 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
169b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
169c0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
169d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
169e0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
169f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
16a00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
16a10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
16a20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
16a30 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
16a40 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
16a50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
16a60 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
16a70 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
16a80 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
16a90 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
16aa0 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
16ab0 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
16ac0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
16ad0 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
16ae0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
16af0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
16b00 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
16b10 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
16b20 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16b30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
16b40 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55  herwise:.**.** U
16b50 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20  nless pPgnoNext 
16b60 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67  is NULL, the pag
16b70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16b80 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  next overflow .*
16b90 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  * page in the li
16ba0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72 69  nked list is wri
16bb0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
16bc0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
16bd0 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
16be0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
16bf0 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ed list, *pPgnoN
16c00 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
16c10 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
16c20 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
16c30 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  , *ppPage is set
16c40 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a   to the MemPage*
16c50 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70   handle.** for p
16c60 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e  age ovfl. The un
16c70 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70  derlying pager p
16c80 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  age may have bee
16c90 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77  n requested.** w
16ca0 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e  ith the noConten
16cb0 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74  t flag set, so t
16cc0 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63 63  he page data acc
16cd0 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74  essable via.** t
16ce0 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e  his handle may n
16cf0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a  ot be trusted..*
16d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
16d10 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
16d20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
16d30 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d50 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
16d60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
16d70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
16d80 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
16d90 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
16da0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
16db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16dc0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
16dd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
16de0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
16df0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
16e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16e10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16e20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
16e30 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73  One of these mus
16e40 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f  t not be NULL. O
16e50 74 68 65 72 77 69 73 65 2c 20 77 68 79 20 63 61  therwise, why ca
16e60 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
16e70 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70  ? */.  assert(pp
16e80 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78  Page || pPgnoNex
16e90 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67  t);..  /* If pPg
16ea0 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20  noNext is NULL, 
16eb0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
16ec0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
16ed0 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a  ed to obtain.  *
16ee0 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66  * a MemPage* ref
16ef0 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20  erence only. No 
16f00 70 61 67 65 2d 64 61 74 61 20 69 73 20 72 65 71  page-data is req
16f10 75 69 72 65 64 20 69 6e 20 74 68 69 73 20 63 61  uired in this ca
16f20 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se..  */.  if( !
16f30 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20  pPgnoNext ){.   
16f40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
16f50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
16f60 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31   ovfl, ppPage, 1
16f70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
16f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16f90 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
16fa0 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
16fb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
16fc0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
16fd0 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
16fe0 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
16ff0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
17000 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
17010 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
17020 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
17030 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
17040 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
17050 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
17060 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
17070 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
17080 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
17090 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
170a0 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
170b0 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
170c0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
170d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
170e0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
170f0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
17100 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
17110 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
17120 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
17130 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17140 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
17150 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
17160 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
17170 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
17180 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
17190 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  s<=pagerPagecoun
171a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
171b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
171c0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
171d0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
171e0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
171f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17220 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
17230 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
17240 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
17250 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
17260 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ss;.      }.    
17270 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
17280 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70  if( next==0 || p
17290 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d  pPage ){.    Mem
172a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
172b0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
172c0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
172d0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
172e0 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20  , next!=0);.    
172f0 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
17300 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
17310 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d  );.    if( next=
17320 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
17330 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
17340 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
17350 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
17360 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67  }..    if( ppPag
17370 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  e ){.      *ppPa
17380 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20  ge = pPage;.    
17390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c  }else{.      rel
173a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
173b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
173c0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
173d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
173e0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
173f0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
17400 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
17410 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
17420 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
17430 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
17440 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
17450 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
17460 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
17470 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
17480 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
17490 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
174a0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
174b0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
174c0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
174d0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
174e0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
174f0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
17500 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
17510 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
17520 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
17530 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
17540 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
17550 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
17560 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
17570 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
17580 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
17590 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
175a0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
175b0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
175c0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
175d0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
175e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
175f0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
17600 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
17610 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
17620 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
17630 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
17640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17650 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
17660 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
17670 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
17680 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
17690 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
176a0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
176b0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
176c0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
176d0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
176e0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
176f0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
17700 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
17710 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
17720 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
17730 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
17740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17750 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
17760 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17780 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17790 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
177a0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
177b0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
177c0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
177d0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
177e0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
177f0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
17800 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
17810 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
17820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
17840 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
17850 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
17860 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
17870 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
17880 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
17890 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
178a0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
178b0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
178c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
178d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
178e0 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
178f0 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
17900 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
17910 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
17920 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
17930 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
17940 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
17950 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
17960 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
17970 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
17980 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
17990 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
179a0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
179b0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
179c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
179d0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
179e0 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
179f0 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
17a00 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
17a10 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
17a20 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
17a30 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
17a40 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
17a50 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
17a60 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
17a70 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
17a80 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
17a90 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
17aa0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
17ab0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
17ac0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
17ad0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
17ae0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
17af0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
17b00 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
17b10 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
17b20 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
17b30 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
17b40 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
17b50 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
17b60 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
17b70 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
17b80 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
17b90 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
17ba0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
17bb0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
17bc0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
17bd0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
17be0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
17bf0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
17c00 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
17c10 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
17c20 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
17c30 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
17c40 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
17c50 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
17c60 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
17c70 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
17c80 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
17c90 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
17ca0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
17cb0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
17cc0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
17cd0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
17ce0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
17cf0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
17d00 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
17d10 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
17d20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
17d30 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
17d40 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
17d50 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
17d60 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
17d70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17d80 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
17d90 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
17da0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17db0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
17dc0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
17dd0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
17de0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
17df0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
17e00 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
17e10 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
17e20 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17e40 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
17e50 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
17e60 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
17e70 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
17e80 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
17e90 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
17ea0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
17eb0 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
17ec0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
17ed0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
17ee0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
17ef0 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
17f00 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
17f10 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
17f20 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
17f30 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
17f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
17f50 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
17f60 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
17f70 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
17f80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
17f90 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
17fa0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
17fb0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
17fc0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
17ff0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
18000 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
18010 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
18020 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18030 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
18050 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
18060 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
18070 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
18080 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20   offset>=0 );.  
18090 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
180a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
180b0 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
180c0 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
180d0 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
180e0 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
180f0 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
18100 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
18110 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e  Key ? 0 : pCur->
18120 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
18130 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
18140 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
18150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
18160 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
18170 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29  ur->info.nData )
18180 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
18190 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
181a0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
181b0 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
181c0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
181d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
181e0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
181f0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
18200 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
18210 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
18220 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
18230 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
18240 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
18250 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
18260 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
18270 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
18280 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
18290 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
182a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
182b0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
182c0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
182d0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
182e0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
182f0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
18300 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
18310 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
18320 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
18330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
18340 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
18350 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
18360 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42    pBt = pCur->pB
18370 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t;.  if( rc==SQL
18380 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
18390 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
183a0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
183b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
183c0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
183d0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
183e0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
183f0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
18400 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
18410 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
18420 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
18430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18440 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
18450 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
18460 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
18470 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
18480 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
18490 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
184a0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
184b0 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
184c0 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
184d0 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
184e0 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
184f0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
18500 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
18510 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
18520 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
18530 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
18540 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
18550 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
18560 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
18570 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
18580 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
18590 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
185a0 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
185b0 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
185c0 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
185d0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
185e0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
185f0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
18600 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
18610 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
18620 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
18630 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
18640 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
18650 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
18660 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
18670 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
18680 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
18690 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
186a0 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
186b0 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43  if( nOvfl && !pC
186c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
186d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
186e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
186f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18700 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
18710 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
18720 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
18730 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
18740 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
18750 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
18760 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
18770 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
18780 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
18790 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
187a0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
187b0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
187c0 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
187d0 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
187e0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
187f0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
18800 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
18810 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18820 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
18830 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
18840 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
18850 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
18860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
18870 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
18880 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
18890 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
188a0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
188b0 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
188c0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
188d0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
188e0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
188f0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
18900 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
18910 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
18920 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
18930 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
18940 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
18950 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
18960 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
18970 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
18980 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
18990 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
189a0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
189b0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
189c0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
189d0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
189e0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
189f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
18a00 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
18a10 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
18a20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
18a30 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
18a40 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
18a50 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
18a60 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
18a70 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
18a80 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
18a90 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
18aa0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
18ab0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
18ac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
18ad0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
18ae0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18af0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
18b00 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
18b10 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
18b20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18b30 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
18b40 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
18b50 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18b60 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
18b70 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
18b80 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
18b90 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
18ba0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
18bb0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
18bc0 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
18bd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
18be0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
18bf0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
18c00 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
18c10 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
18c20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
18c30 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
18c40 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
18c50 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
18c60 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
18c70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18c80 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
18c90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
18ca0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
18cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18cc0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
18cd0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
18ce0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18d10 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
18d20 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
18d30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18d40 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
18d50 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
18d60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18d70 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
18d80 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
18d90 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
18da0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
18db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18dc0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
18dd0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
18de0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
18df0 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
18e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18e10 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
18e20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
18e30 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
18e40 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
18e50 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
18e60 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
18e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18e80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
18e90 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
18ea0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18eb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18ed0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18ee0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
18ef0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18f00 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
18f10 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
18f20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
18f30 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
18f40 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
18f50 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
18f60 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
18f70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18f80 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
18f90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
18fa0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
18fb0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
18fc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
18fd0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
18fe0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
18ff0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
19000 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
19010 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
19020 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
19030 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
19040 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
19050 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
19060 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19070 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19080 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
19090 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
190a0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
190b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
190c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
190d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
190e0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
190f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
19100 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
19110 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
19120 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70      if( pCur->ap
19130 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
19140 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19160 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
19170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
19180 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
19190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
191a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
191b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
191c0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
191d0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
191e0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
191f0 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
19200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19210 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
19220 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
19230 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
19240 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
19250 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
19260 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
19270 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
19280 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
19290 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
192a0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
192b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
192c0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
192d0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
192e0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
192f0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
19300 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
19310 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
19320 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
19330 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
19340 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19350 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
19360 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
19370 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
19380 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
19390 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
193a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
193b0 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
193c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
193d0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
193e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
193f0 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
19400 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
19410 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
19420 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
19430 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
19440 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
19450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19460 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
19470 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19480 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
19490 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
194a0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
194b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
194c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
194d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
194e0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
194f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
19500 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
19510 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
19520 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
19530 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20  , amt, pBuf, 1, 
19540 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19560 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19570 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
19580 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
19590 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
195a0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
195b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
195c0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
195d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
195e0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
195f0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
19600 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
19610 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
19620 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
19630 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
19640 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
19650 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
19660 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
19670 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
19680 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
19690 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
196a0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
196b0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
196c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
196d0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
196e0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
196f0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
19700 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
19710 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
19720 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
19730 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
19740 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
19750 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
19760 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
19770 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
19780 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
19790 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
197a0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
197b0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
197c0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
197d0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
197e0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
197f0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
19800 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
19810 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20  o reassembly.** 
19820 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
19830 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
19840 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
19850 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
19860 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
19870 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
19880 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
19890 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
198a0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
198b0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
198c0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
198d0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
198e0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
198f0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
19900 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
19910 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19920 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
19930 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
19940 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
19950 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
19960 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
19970 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
19980 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
19990 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
199a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
199b0 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
199c0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
199d0 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
199e0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
199f0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
19a00 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
19a10 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
19a20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
19a30 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
19a40 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
19a50 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
19a60 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
19a70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
19a80 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
19a90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19aa0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19ab0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
19ac0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19ad0 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
19ae0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
19af0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
19b00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
19b10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
19b20 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
19b30 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
19b40 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
19b50 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
19b60 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
19b70 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
19b80 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
19b90 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
19ba0 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
19bb0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
19bc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
19bd0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
19be0 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
19bf0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
19c00 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19c10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
19c20 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
19c30 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19c40 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
19c50 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
19c60 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
19c70 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
19c80 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
19c90 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
19ca0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
19cb0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
19cc0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
19cd0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
19ce0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
19cf0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
19d00 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
19d10 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
19d20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
19d30 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
19d40 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19d50 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
19d60 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
19d70 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19d80 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
19d90 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
19da0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
19db0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
19dc0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
19dd0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
19de0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
19df0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
19e00 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
19e10 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
19e20 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
19e30 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
19e40 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
19e50 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
19e60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
19e80 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
19e90 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
19ea0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
19eb0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
19ec0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
19ed0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
19ee0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
19ef0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
19f00 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
19f10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19f20 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19f30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19f40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19f50 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19f60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
19f80 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
19f90 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
19fa0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
19fb0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
19fc0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
19fd0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
19fe0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19ff0 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1a000 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a010 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1a020 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a030 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1a040 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1a050 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1a060 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1a070 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1a080 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1a090 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1a0a0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1a0b0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1a0c0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1a0d0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1a0e0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1a0f0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1a100 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1a110 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1a120 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1a130 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1a140 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
1a150 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
1a160 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
1a170 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a180 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
1a190 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a1a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a1b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a1c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a1d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1a1e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1a1f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
1a200 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
1a210 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
1a220 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
1a230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a240 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1a250 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
1a260 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1a270 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1a280 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
1a290 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1a2a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
1a2b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
1a2c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
1a2d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
1a2e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
1a2f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1a300 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1a310 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
1a320 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
1a330 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a340 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1a360 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a370 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1a380 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
1a390 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
1a3a0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
1a3b0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
1a3c0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
1a3d0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1a3e0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
1a3f0 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
1a400 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
1a410 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
1a420 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
1a430 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
1a440 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
1a450 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
1a460 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
1a470 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
1a480 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
1a490 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
1a4a0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1a4b0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
1a4c0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
1a4d0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
1a4e0 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
1a4f0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
1a500 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
1a510 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
1a520 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
1a530 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
1a540 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
1a550 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
1a560 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
1a570 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1a580 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
1a590 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
1a5a0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
1a5b0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
1a5c0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
1a5d0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
1a5e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
1a5f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
1a600 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
1a610 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
1a620 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
1a630 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
1a640 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1a650 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1a660 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
1a670 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
1a680 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1a690 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
1a6a0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
1a6b0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
1a6c0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
1a6d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
1a6e0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
1a6f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a700 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1a710 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1a720 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1a730 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a740 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a750 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a760 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a770 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1a780 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
1a790 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1a7a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1a7b0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
1a7c0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
1a7d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1a7e0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1a7f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1a800 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1a810 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1a820 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
1a830 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1a840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1a850 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
1a860 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
1a870 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a880 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a890 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
1a8a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a8b0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
1a8c0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
1a8d0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
1a8e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a8f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
1a900 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a910 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
1a920 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
1a930 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1a940 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1a950 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1a960 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1a970 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1a980 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
1a990 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1a9a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1a9b0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
1a9c0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1a9d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1a9e0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
1a9f0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1aa00 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
1aa10 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
1aa20 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
1aa30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1aa40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
1aa50 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
1aa60 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
1aa70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1aa80 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1aa90 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
1aaa0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1aab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1aac0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
1aad0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1aae0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1aaf0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1ab00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [i]);.    }.  }e
1ab10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
1ab20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
1ab30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1ab40 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
1ab50 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
1ab60 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
1ab70 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
1ab80 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1ab90 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
1aba0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1abb0 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
1abc0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
1abd0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1abe0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1abf0 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
1ac00 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75  iPage = 0;.  pCu
1ac10 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
1ac20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1ac30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1ac40 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
1ac50 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1ac60 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
1ac70 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1ac80 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1ac90 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1aca0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1acb0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1acc0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1acd0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1ace0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1acf0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1ad00 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1ad10 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1ad20 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1ad30 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1ad40 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1ad50 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
1ad60 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1ad70 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
1ad80 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1ad90 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1ada0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
1adb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1adc0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1add0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
1ade0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1adf0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
1ae00 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
1ae10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1ae20 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
1ae30 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1ae40 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1ae50 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
1ae60 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
1ae70 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1ae80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ae90 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
1aea0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1aeb0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1aec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1aed0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1aee0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1aef0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1af00 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1af10 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1af20 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1af30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1af40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1af50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1af60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1af70 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1af80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1af90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1afa0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1afb0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1afc0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1afd0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
1afe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
1aff0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1b000 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1b010 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b020 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1b030 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1b040 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1b050 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1b060 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1b070 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1b080 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1b090 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1b0a0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1b0b0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1b0c0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1b0d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1b0e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1b0f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1b100 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1b110 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1b120 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1b130 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1b140 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1b150 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1b160 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1b170 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1b180 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1b190 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1b1a0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1b1b0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1b1c0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1b1d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1b1e0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1b1f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b200 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1b210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b220 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b230 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1b240 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b250 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b260 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1b270 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b280 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b290 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1b2a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1b2b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1b2c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1b2d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1b2e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b2f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1b300 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1b310 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1b320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
1b330 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1b340 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1b350 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1b360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1b370 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1b380 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
1b390 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
1b3a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b3b0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1b3c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
1b3d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b3e0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1b3f0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1b400 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1b410 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1b420 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1b430 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1b440 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1b450 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1b460 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1b470 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1b480 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1b490 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1b4a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b4b0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1b4c0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b4d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1b4e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b4f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b500 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b510 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1b520 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1b530 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1b540 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1b550 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1b570 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b580 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1b590 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b5a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1b5b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1b5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1b5d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
1b5e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1b600 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1b610 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1b620 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
1b630 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1b640 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1b650 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1b660 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1b680 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1b690 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1b6a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1b6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1b6c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1b6d0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1b6e0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1b6f0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1b700 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1b710 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1b720 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1b730 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1b740 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
1b750 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b760 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b770 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
1b780 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b790 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b7a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b7b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b7c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1b7d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1b7e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1b7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b800 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
1b810 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1b820 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
1b830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1b840 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1b850 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1b860 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1b870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b890 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b8a0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1b8b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1b8c0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1b8d0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67  t(pCur);.      g
1b8e0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1b8f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1b900 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1b910 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1b920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b930 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1b940 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1b950 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1b960 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
1b970 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
1b980 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
1b990 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
1b9a0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
1b9b0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
1b9c0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
1b9d0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1b9e0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
1b9f0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
1ba00 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
1ba10 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
1ba20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
1ba30 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
1ba40 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1ba50 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1ba60 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1ba70 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1ba80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1ba90 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1baa0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1bab0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1bac0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1bad0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1bae0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1baf0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1bb00 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1bb10 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1bb20 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1bb30 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1bb40 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1bb50 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1bb60 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1bb70 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1bb80 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1bb90 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1bba0 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1bbb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1bbc0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1bbd0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1bbe0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1bbf0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1bc00 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1bc10 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1bc20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1bc30 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1bc50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1bc60 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1bc70 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1bc80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1bc90 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1bca0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1bcb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1bcc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1bcd0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1bce0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1bcf0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1bd00 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1bd10 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1bd20 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1bd30 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1bd40 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1bd50 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f  than pKey..**.*/
1bd60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bd70 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1bd80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1bd90 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
1bda0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
1bdb0 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
1bdc0 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
1bdd0 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
1bde0 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
1bdf0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
1be00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1be10 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
1be20 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
1be30 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1be40 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1be50 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1be60 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1be70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1be80 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
1be90 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1bea0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
1beb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1bec0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1bed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1bee0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1bef0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1bf00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
1bf10 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
1bf20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
1bf30 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
1bf40 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
1bf50 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
1bf60 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1bf70 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1bf80 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
1bf90 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1bfa0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
1bfb0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1bfc0 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70   .   && pCur->ap
1bfd0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
1bfe0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
1bff0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
1c000 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
1c010 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1c020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c040 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
1c050 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
1c060 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1c070 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1c080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c090 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1c0a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1c0b0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c0c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1c0d0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1c0e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1c0f0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1c100 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1c110 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c120 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  ]->isInit );.  i
1c130 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1c140 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c150 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1c160 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1c170 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1c180 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1c190 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1c1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c1b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c1c0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
1c1d0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
1c1e0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1c1f0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1c200 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1c210 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c220 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1c230 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1c240 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f    int c = -1;  /
1c250 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66  * pRes return if
1c260 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20   table is empty 
1c270 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20  must be -1 */.  
1c280 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
1c290 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
1c2a0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50  l-1;.    if( !pP
1c2b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
1c2c0 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  IdxKey==0 ){.   
1c2d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1c2e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c2f0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c300 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
1c310 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29   if( biasRight )
1c320 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
1c330 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1c340 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73   = upr;.    }els
1c350 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
1c360 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1c370 5d 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b  ] = (upr+lwr)/2;
1c380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
1c390 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b  wr<=upr ) for(;;
1c3a0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
1c3b0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69  CellKey;.      i
1c3c0 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
1c3d0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
1c3e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1c3f0 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 70 43 75  Page];.      pCu
1c400 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1c410 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  0;.      pCur->v
1c420 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1c430 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1c440 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1c450 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
1c460 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
1c470 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
1c480 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
1c490 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
1c4a0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1c4b0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
1c4c0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
1c4d0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
1c4e0 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
1c4f0 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20   dummy);.       
1c500 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1c510 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1c520 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1c530 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1c540 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
1c550 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
1c560 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c570 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
1c580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1c590 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1c5a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
1c5b0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
1c5c0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
1c5d0 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20      c = +1;.    
1c5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1c5f0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e{.        int a
1c600 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20  vailable;.      
1c610 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f    pCellKey = (vo
1c620 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  id *)fetchPayloa
1c630 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62  d(pCur, &availab
1c640 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  le, 0);.        
1c650 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d  nCellKey = pCur-
1c660 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
1c670 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c      if( availabl
1c680 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20  e>=nCellKey ){. 
1c690 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
1c6a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c6b0 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20  mpare(nCellKey, 
1c6c0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1c6d0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1c6e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1c6f0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
1c700 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20  alloc( nCellKey 
1c710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c720 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
1c730 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1c740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c750 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1c760 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c790 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1c7a0 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
1c7b0 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
1c7c0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1c7d0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c7e0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c  ompare(nCellKey,
1c7f0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
1c800 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
1c810 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
1c820 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1c830 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c840 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c860 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1c870 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1c880 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
1c890 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
1c8a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1c8b0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1c8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
1c8d0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
1c8e0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
1c8f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c900 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c910 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c920 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b  Res ) *pRes = 0;
1c930 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c950 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c960 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1c970 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1c980 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
1c990 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
1c9a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c9b0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
1c9c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1c9d0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
1c9e0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1c9f0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1ca00 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ey;.        brea
1ca10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ca20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1ca30 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 6c 77 72  r->iPage] = (lwr
1ca40 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +upr)/2;.    }. 
1ca50 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1ca60 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1ca70 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1ca80 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1ca90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1caa0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1cab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1cac0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1cad0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1cae0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1caf0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1cb00 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1cb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1cb20 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1cb30 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1cb40 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1cb50 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1cb60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1cb70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1cb80 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1cb90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1cba0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1cbb0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1cbc0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
1cbd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cbe0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1cbf0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1cc00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1cc10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 6c  pCur->iPage] = l
1cc20 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
1cc30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1cc40 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1cc50 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
1cc60 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1cc70 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
1cc80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1cc90 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
1cca0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
1ccb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ccc0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
1ccd0 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76  sion of BtreeMov
1cce0 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70  eto, pKey is a p
1ccf0 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f  acked index reco
1cd00 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73  rd.** such as is
1cd10 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
1cd20 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1cd30 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20  opcode.  Unpack 
1cd40 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e  the.** record an
1cd50 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65  d then call Btre
1cd60 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1cd70 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  ) to do the work
1cd80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cd90 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  BtreeMoveto(.  B
1cda0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1cdb0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
1cdc0 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74  n on the btree t
1cdd0 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
1cde0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1cdf0 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64  Key,   /* Packed
1ce00 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65   key if the btre
1ce10 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  e is an index */
1ce20 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
1ce30 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
1ce40 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  r key for tables
1ce50 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20  .  Size of pKey 
1ce60 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  for indices */. 
1ce70 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20   int bias,      
1ce80 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61       /* Bias sea
1ce90 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
1cea0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
1ceb0 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  es           /* 
1cec0 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1ced0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1cee0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf00 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20  Status code */. 
1cf10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1cf20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55  *pIdxKey;   /* U
1cf30 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1cf40 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1cf50 65 63 6f 72 64 20 61 53 70 61 63 65 5b 31 36 5d  ecord aSpace[16]
1cf60 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20  ; /* Temp space 
1cf70 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f  for pIdxKey - to
1cf80 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20   avoid a malloc 
1cf90 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  */..  if( pKey )
1cfa0 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
1cfb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1cfc0 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
1cfd0 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b  eyInfo, nKey, pK
1cfe0 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65            aSpace
1d010 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
1d020 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
1d030 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
1d040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1d050 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
1d060 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
1d070 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1d080 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
1d090 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
1d0a0 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20  , bias, pRes);. 
1d0b0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1d0c0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1d0d0 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1d0e0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20  (pIdxKey);.  }. 
1d0f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d100 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1d110 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1d120 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1d130 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1d140 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1d150 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1d160 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1d170 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1d180 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1d190 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1d1a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1d1b0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1d1c0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1d1d0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1d1e0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1d1f0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1d200 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1d210 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1d220 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1d230 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d240 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1d250 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1d260 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1d270 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1d280 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1d290 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1d2a0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1d2b0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1d2c0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1d2d0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1d2e0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1d2f0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1d300 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1d310 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1d320 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1d330 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d340 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1d350 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
1d360 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71   a cursor..*/.sq
1d370 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74  lite3 *sqlite3Bt
1d380 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73  reeCursorDb(cons
1d390 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t BtCursor *pCur
1d3a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1d3b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d3c0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1d3d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
1d3e0 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65  turn pCur->pBtre
1d3f0 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->db;.}../*.** 
1d400 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
1d410 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
1d420 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1d430 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
1d440 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
1d450 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
1d460 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
1d470 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
1d480 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1d490 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1d4a0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
1d4b0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1d4c0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
1d4d0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
1d4e0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1d4f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d500 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1d510 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
1d520 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d530 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1d540 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d550 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1d560 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1d570 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1d580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1d5a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d5b0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
1d5c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1d5d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1d5e0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1d5f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d600 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d610 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1d620 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1d630 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1d640 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1d650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1d660 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1d670 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1d680 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1d690 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
1d6a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1d6b0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1d6c0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1d6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1d6e0 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
1d6f0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
1d700 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1d710 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d720 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
1d730 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1d740 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d750 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1d760 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1d770 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
1d780 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1d790 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
1d7a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1d7b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d7c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1d7d0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1d7e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1d7f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d800 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
1d810 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d820 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1d830 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1d840 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1d850 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1d860 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d880 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d890 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1d8a0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1d8b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1d8c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d8d0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
1d8e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1d8f0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
1d900 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
1d910 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
1d920 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1d930 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d940 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
1d950 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1d960 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1d970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d980 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d990 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1d9a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
1d9b0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
1d9c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d9d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1d9e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1d9f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1da00 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
1da10 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
1da20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
1da30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1da40 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1da50 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1da60 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1da70 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1da80 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1da90 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
1daa0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1dab0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1dac0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1dad0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1dae0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1daf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1db00 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
1db10 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1db20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
1db30 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1db40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1db50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1db60 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1db70 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1db80 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1db90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1dbb0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1dbc0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
1dbd0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1dbe0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1dbf0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1dc00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dc10 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1dc20 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
1dc30 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1dc40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1dc50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dc60 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1dc70 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1dc80 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1dc90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1dca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1dcb0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1dcc0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dcd0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
1dce0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1dcf0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
1dd00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1dd10 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
1dd20 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
1dd30 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
1dd40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1dd50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1dd60 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1dd70 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1dd80 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1dd90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1dda0 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
1ddb0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1ddc0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1ddd0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1dde0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1ddf0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1de00 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1de10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1de20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1de30 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1de40 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
1de50 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1de60 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1de70 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1de80 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
1de90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1dea0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
1deb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1dec0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1ded0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1dee0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1def0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1df00 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1df10 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
1df20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1df30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1df40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1df50 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
1df60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1df70 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
1df80 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
1df90 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1dfa0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
1dfb0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1dfc0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
1dfd0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
1dfe0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
1dff0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1e000 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
1e010 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
1e020 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
1e030 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
1e040 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
1e050 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
1e060 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1e070 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
1e080 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
1e090 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
1e0a0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
1e0b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e0c0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1e0d0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
1e0e0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1e0f0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
1e100 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
1e110 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
1e120 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1e130 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
1e140 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
1e150 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e160 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
1e170 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1e180 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
1e190 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
1e1a0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
1e1b0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
1e1c0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1e1d0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
1e1e0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
1e1f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
1e200 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
1e210 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
1e220 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
1e230 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
1e240 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
1e250 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
1e260 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
1e270 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
1e280 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
1e290 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
1e2a0 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
1e2b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1e2c0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
1e2d0 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
1e2e0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
1e2f0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1e300 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
1e310 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
1e320 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1e330 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
1e340 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1e350 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
1e360 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
1e370 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1e380 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1e390 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
1e3a0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
1e3b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
1e3c0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
1e3d0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
1e3e0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
1e3f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
1e400 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1e410 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1e420 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1e430 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
1e440 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
1e450 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
1e460 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
1e470 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
1e480 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
1e490 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1e4a0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a  PrevTrunk = 0;..
1e4b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e4c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1e4d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
1e4e0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1e4f0 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
1e500 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e510 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
1e520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
1e530 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
1e540 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
1e550 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
1e560 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
1e570 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
1e580 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
1e590 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
1e5a0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
1e5b0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
1e5c0 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
1e5d0 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
1e5e0 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
1e5f0 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
1e600 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
1e610 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
1e620 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1e630 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
1e640 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1e650 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
1e660 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
1e670 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
1e680 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
1e690 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
1e6a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e6b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1e6c0 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
1e6d0 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  y<=pagerPagecoun
1e6e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1e6f0 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
1e700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e710 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
1e720 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1e730 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
1e740 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1e750 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
1e760 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
1e770 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e780 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
1e790 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
1e7a0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
1e7b0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
1e7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1e7d0 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
1e7e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1e7f0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1e800 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
1e810 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
1e820 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
1e830 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
1e840 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
1e850 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
1e860 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
1e870 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
1e880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e890 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1e8a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1e8b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e8c0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
1e8d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e8e0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
1e8f0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
1e900 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
1e910 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
1e920 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
1e930 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
1e940 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
1e950 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
1e960 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
1e970 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
1e980 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
1e990 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
1e9a0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
1e9b0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
1e9c0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
1e9d0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
1e9e0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
1e9f0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1ea00 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1ea10 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1ea20 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
1ea30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1ea40 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1ea50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ea60 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
1ea70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ea80 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1ea90 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
1eaa0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
1eab0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
1eac0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1ead0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1eae0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1eaf0 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
1eb00 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1eb10 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
1eb20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
1eb30 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
1eb40 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1eb50 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
1eb60 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
1eb70 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
1eb80 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
1eb90 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
1eba0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
1ebb0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
1ebc0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
1ebd0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
1ebe0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
1ebf0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
1ec00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
1ec10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ec20 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1ec30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ec40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ec50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ec60 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1ec70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
1ec80 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
1ec90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1eca0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1ecb0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1ecc0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1ecd0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1ece0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
1ecf0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1ed00 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1ed10 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1ed20 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1ed30 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1ed40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1ed50 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
1ed60 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
1ed70 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
1ed80 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
1ed90 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
1eda0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1edb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1edc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1edd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1ede0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
1edf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ee10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
1ee20 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
1ee30 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
1ee40 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
1ee50 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
1ee60 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
1ee70 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
1ee80 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1ee90 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
1eea0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1eeb0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
1eec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1eed0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1eee0 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
1eef0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1ef00 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
1ef10 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1ef20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ef30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1ef40 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1ef50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1ef60 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1ef70 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1ef80 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1ef90 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
1efa0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1efb0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1efc0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1efd0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1efe0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1eff0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1f000 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f010 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f020 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1f030 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1f040 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1f050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f070 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1f080 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
1f090 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1f0a0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
1f0b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
1f0c0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
1f0d0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
1f0e0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
1f0f0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
1f100 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1f110 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
1f120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f130 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
1f140 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
1f150 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
1f160 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1f170 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
1f180 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f190 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1f1a0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
1f1b0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
1f1c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1f1f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f200 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1f210 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f220 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f230 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
1f240 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1f270 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1f280 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1f290 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f2a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f2c0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1f2d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f2e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1f2f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1f300 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
1f310 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1f320 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1f330 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1f340 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
1f350 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
1f360 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
1f370 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f380 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1f390 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1f3a0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1f3b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f3c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f3d0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1f3e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f410 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
1f420 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f430 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
1f450 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f460 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
1f470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1f480 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
1f490 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
1f4a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f4c0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1f4d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1f4e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f4f0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1f500 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1f510 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1f520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1f530 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
1f540 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
1f550 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
1f560 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
1f570 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
1f580 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
1f590 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f5a0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
1f5b0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
1f5c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f5d0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1f5e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f5f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f600 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1f610 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1f620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f630 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
1f640 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
1f650 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
1f660 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1f670 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
1f680 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
1f690 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1f6a0 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
1f6b0 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
1f6c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1f6d0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
1f6e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
1f6f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1f700 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
1f710 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
1f720 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
1f730 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
1f740 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
1f750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1f760 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
1f770 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1f780 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
1f790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1f7a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f7b0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1f7c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1f7d0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
1f7e0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1f7f0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
1f800 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
1f810 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
1f820 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
1f830 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
1f840 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1f850 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
1f860 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65      nPage = page
1f870 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1f880 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1f890 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50     if( *pPgno>nP
1f8a0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
1f8b0 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
1f8c0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1f8d0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
1f8e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f8f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f900 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1f910 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f920 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1f930 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1f940 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f950 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1f960 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1f990 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1f9a0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1f9b0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1f9c0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1f9d0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1f9e0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1f9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1fa00 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1fa10 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1fa20 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1fa30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fa40 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1fa50 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1fa60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fa70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1fa80 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1fa90 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Page, 1);.      
1faa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fac0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1fad0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a  rDontRollback((*
1fae0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1faf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1fb00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fb10 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
1fb20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1fb30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fb40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb50 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1fb60 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fb80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fb90 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1fba0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1fbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
1fbc0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1fbd0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
1fbe0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
1fbf0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
1fc00 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1fc10 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1fc20 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1fc30 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1fc40 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1fc50 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1fc60 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1fc70 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70     int nPage = p
1fc80 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1fc90 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1fca0 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b  *pPgno = nPage +
1fcb0 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
1fcc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fcd0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1fce0 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
1fcf0 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75   /* An incr-vacu
1fd00 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  um has already r
1fd10 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  un within this t
1fd20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74  ransaction. So t
1fd30 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
1fd40 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20   to allocate is 
1fd50 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79  not from the phy
1fd60 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65  sical end of the
1fd70 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20   file, but.     
1fd80 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75   ** at pBt->nTru
1fd90 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nc. .      */.  
1fda0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
1fdb0 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20  ->nTrunc+1;.    
1fdc0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
1fdd0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fde0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
1fdf0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
1fe00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1fe10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1fe20 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
1fe30 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
1fe40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
1fe50 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
1fe60 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1fe70 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
1fe80 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
1fe90 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
1fea0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
1feb0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
1fec0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
1fed0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
1fee0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
1fef0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
1ff00 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
1ff10 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
1ff20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52       */.      TR
1ff30 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1ff40 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1ff50 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
1ff60 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
1ff70 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
1ff80 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1ff90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ffa0 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) );.      (*pPg
1ffb0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  no)++;.      if(
1ffc0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1ffd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ffe0 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d  ){ (*pPgno)++; }
1fff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20000 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20  Bt->nTrunc ){.  
20010 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
20020 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a  = *pPgno;.    }.
20030 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
20040 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
20050 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20060 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  t) );.    rc = s
20070 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
20080 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
20090 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
200a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
200b0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
200c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
200d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
200e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
200f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20100 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20110 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
20120 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20130 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
20140 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
20150 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
20160 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
20170 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20180 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
20190 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
201a0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
201b0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
201c0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
201d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
201e0 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65  K && sqlite3Page
201f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
20200 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
20210 29 3e 31 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  )>1 ){.    relea
20220 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
20230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20240 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
20270 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
20280 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68  abase file to th
20290 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
202a0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
202b0 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c  ref() is NOT cal
202c0 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  led for pPage..*
202d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
202e0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
202f0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
20300 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
20310 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
20320 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
20330 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20  age1;.  int rc, 
20340 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70  n, k;..  /* Prep
20350 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f 72  are the page for
20360 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73   freeing */.  as
20370 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20380 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
20390 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
203a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
203b0 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67  pgno>1 );.  pPag
203c0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 0a  e->isInit = 0;..
203d0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
203e0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
203f0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
20400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20410 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
20420 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
20430 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20440 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
20450 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20460 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
20470 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20480 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
20490 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
204a0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
204b0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
204c0 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
204d0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
204e0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
204f0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
20500 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
20510 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
20520 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
20530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20540 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20550 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
20560 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20570 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
20580 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
20590 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
205a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
205b0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
205c0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
205d0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
205e0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
205f0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
20600 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
20610 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
20620 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
20630 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
20640 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
20650 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  Page->pgno, PTRM
20660 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
20670 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20680 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
20690 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
206a0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
206b0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a  irst free page *
206c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
206d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
206e0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
206f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20700 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74  n rc;.    memset
20710 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
20720 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 8);.    put4by
20730 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20740 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20750 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  no);.    TRACE((
20760 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66  "FREE-PAGE: %d f
20770 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  irst\n", pPage->
20780 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
20790 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72  .    /* Other fr
207a0 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  ee pages already
207b0 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65   exist.  Retrive
207c0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
207d0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20   page.    ** of 
207e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
207f0 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61   find out how ma
20800 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73  ny leaves it has
20810 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
20820 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63   *pTrunk;.    rc
20830 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
20840 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  etPage(pBt, get4
20850 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20860 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e  ata[32]), &pTrun
20870 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
20880 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20890 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
208a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
208b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  ]);.    if( k>=p
208c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
208d0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
208e0 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75   The trunk is fu
208f0 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61  ll.  Turn the pa
20900 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69  ge being freed i
20910 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20  nto a new.      
20920 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69  ** trunk page wi
20930 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20  th no leaves..  
20940 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20950 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
20960 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
20970 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
20980 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
20990 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
209a0 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
209b0 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
209c0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
209d0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
209e0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
209f0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
20a00 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
20a10 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
20a20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
20a30 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
20a40 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
20a50 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
20a60 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
20a70 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
20a80 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
20a90 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
20aa0 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
20ab0 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
20ac0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
20ad0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
20ae0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
20af0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
20b00 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
20b10 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
20b20 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
20b30 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
20b40 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
20b50 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
20b60 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
20b70 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
20b80 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
20b90 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
20ba0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
20bb0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
20bc0 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
20bd0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
20be0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
20bf0 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
20c00 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
20c10 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
20c20 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
20c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20c40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
20c50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20c70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
20c80 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
20c90 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  ta, pTrunk->pgno
20ca0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20cb0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
20cc0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  a[4], 0);.      
20cd0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20ce0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
20cf0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
20d00 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
20d10 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
20d20 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
20d30 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
20d40 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
20d50 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e  ->pgno, pTrunk->
20d60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
20d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c      }else if( k<
20d80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20d90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
20da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20db0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c   /* Add the newl
20dc0 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20  y freed page as 
20dd0 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75  a leaf on the cu
20de0 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20  rrent trunk */. 
20df0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20e00 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
20e10 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
20e20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20e40 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
20e50 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
20e60 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20e70 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
20e80 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
20e90 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
20ea0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
20eb0 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 72 63  ELETE.        rc
20ec0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 44   = sqlite3PagerD
20ed0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
20ee0 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  pDbPage);.#endif
20ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
20f00 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
20f10 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
20f20 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
20f30 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
20f40 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
20f50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20f60 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72  pTrunk);.  }.  r
20f70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20f80 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
20f90 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
20fa0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
20fb0 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
20fc0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
20fd0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
20fe0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
20ff0 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
21000 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21010 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
21020 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
21030 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
21040 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
21050 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53  .  int ovflPageS
21060 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
21070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21080 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21090 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
210a0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
210b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
210c0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
210d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
210e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
210f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
21100 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
21110 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
21120 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
21130 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
21140 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
21150 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
21160 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65  ow]);.  ovflPage
21170 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
21180 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
21190 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
211a0 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
211b0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
211c0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
211d0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
211e0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
211f0 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
21200 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
21210 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b   MemPage *pOvfl;
21220 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
21230 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  o==0 || ovflPgno
21240 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
21250 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
21260 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21270 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21280 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
21290 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
212a0 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
212b0 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d   &pOvfl, (nOvfl=
212c0 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29  =0)?0:&ovflPgno)
212d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
212e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
212f0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
21300 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  l);.    sqlite3P
21310 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
21320 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
21330 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21340 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
21350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21360 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
21370 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
21380 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
21390 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
213a0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
213b0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
213c0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
213d0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
213e0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
213f0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
21400 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
21410 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
21420 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
21430 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
21440 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
21450 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
21460 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
21470 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
21480 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
21490 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
214a0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
214b0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
214c0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
214d0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
214e0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
214f0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
21500 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
21510 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
21520 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
21530 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
21540 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
21550 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
21560 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
21570 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
21580 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
21590 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
215a0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
215b0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
215c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
215d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
215e0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
215f0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
21600 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
21610 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
21620 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
21630 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
21640 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
21650 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
21660 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
21690 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
216a0 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
216b0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
216c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
216d0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
216e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
216f0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
21700 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
21710 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
21720 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
21730 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
21740 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
21750 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
21760 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21770 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
21780 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
21790 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
217a0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
217b0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
217c0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
217d0 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
217e0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
217f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21800 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21810 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
21820 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
21830 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
21840 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
21850 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
21860 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
21870 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
21880 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
21890 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
218a0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
218b0 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
218c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
218d0 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
218e0 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
218f0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
21900 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
21910 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
21920 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21930 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
21940 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
21950 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
21960 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
21970 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21980 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
21990 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
219a0 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
219b0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
219c0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
219d0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
219e0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
219f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
21a00 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
21a10 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
21a20 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
21a30 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
21a40 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
21a50 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
21a60 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
21a70 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
21a80 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
21a90 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
21aa0 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
21ab0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
21ac0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
21ad0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
21ae0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
21af0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
21b00 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
21b10 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
21b20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
21b30 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
21b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21b50 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
21b60 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
21b70 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
21b80 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
21b90 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
21ba0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
21bb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
21bc0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
21bd0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
21be0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
21bf0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
21c00 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
21c10 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
21c20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
21c30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21c40 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
21c50 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
21c60 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
21c70 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
21c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
21c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21ca0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
21cb0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
21cc0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
21cd0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
21ce0 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
21cf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21d00 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
21d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
21d20 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
21d30 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
21d40 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
21d50 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
21d60 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
21d70 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
21d80 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
21d90 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
21da0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
21db0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
21dc0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
21dd0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
21de0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
21df0 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
21e00 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
21e10 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
21e20 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
21e30 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
21e40 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
21e50 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
21e60 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
21e70 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
21e80 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
21e90 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
21ea0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
21eb0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
21ec0 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
21ed0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
21ee0 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
21ef0 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
21f00 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
21f10 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
21f20 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
21f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f40 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
21f50 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
21f60 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
21f70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
21f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
21f90 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
21fa0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
21fb0 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
21fc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21fd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21fe0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
21ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
22000 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
22010 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
22020 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
22030 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
22040 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22050 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
22060 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
22070 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22080 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
22090 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
220a0 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
220b0 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
220c0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
220d0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
220e0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
220f0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
22100 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
22110 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
22120 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
22130 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
22140 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
22150 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
22160 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
22170 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
22180 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
22190 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
221a0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
221b0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
221c0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
221d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
221e0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
221f0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
22200 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
22210 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
22220 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
22230 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
22240 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
22250 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
22260 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
22270 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
22280 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
22290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
222a0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
222b0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
222c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
222d0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
222e0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
222f0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
22300 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
22310 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
22320 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
22330 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
22340 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
22350 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22360 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
22370 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
22380 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
22390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
223a0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
223b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
223c0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
223d0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
223e0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
223f0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
22400 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
22410 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
22420 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
22430 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
22440 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
22450 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22460 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
22470 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
22480 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
22490 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
224a0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
224b0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
224c0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
224d0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
224e0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
224f0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
22500 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
22510 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
22520 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
22530 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
22540 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
22550 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
22560 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22570 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
22580 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
22590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
225a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
225b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
225c0 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
225d0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
225e0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
225f0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
22600 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
22610 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
22620 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
22630 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
22640 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
22650 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
22660 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
22670 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
22680 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
22690 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
226a0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
226b0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
226c0 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
226d0 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
226e0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
226f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
22700 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
22710 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
22720 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
22730 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
22740 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
22750 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
22760 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
22770 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
22780 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
22790 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
227a0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
227b0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
227c0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
227d0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
227e0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
227f0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
22800 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
22810 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
22820 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
22830 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
22840 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
22850 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
22860 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
22870 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
22880 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
22890 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
228a0 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
228b0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
228c0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
228d0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
228e0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
228f0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
22900 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
22910 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
22920 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
22930 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
22940 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
22950 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
22960 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
22970 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
22980 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
22990 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
229a0 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
229b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
229c0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
229d0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
229e0 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
229f0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
22a00 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
22a10 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
22a20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
22a30 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
22a40 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
22a50 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
22a60 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
22a70 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
22a80 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
22a90 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
22aa0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
22ab0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
22ac0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
22ad0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
22ae0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
22af0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
22b00 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
22b10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
22b20 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
22b30 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
22b40 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
22b50 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
22b60 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
22b70 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
22b80 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
22b90 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
22ba0 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
22bb0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
22bc0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
22bd0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
22be0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
22bf0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
22c00 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
22c10 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
22c20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22c30 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
22c40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22c50 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
22c60 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
22c70 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
22c80 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
22c90 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
22ca0 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
22cb0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
22cc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
22cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22ce0 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
22cf0 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
22d00 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
22d10 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
22d20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
22d30 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
22d40 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
22d50 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
22d60 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
22d70 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
22d80 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
22d90 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
22da0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22db0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
22dc0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
22dd0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
22de0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
22df0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
22e00 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
22e10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
22e20 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
22e30 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
22e40 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
22e50 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
22e60 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
22e70 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
22e80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22e90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
22ea0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
22eb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
22ec0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
22ed0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
22ee0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
22ef0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
22f00 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
22f10 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
22f20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
22f30 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
22f40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
22f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
22f60 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
22f70 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
22f80 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a  e->aOvfl[0]) );.
22f90 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
22fa0 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
22fb0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
22fc0 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a  vfl[j].idx = i;.
22fd0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
22fe0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22ff0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
23000 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23010 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
23020 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
23040 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23050 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23060 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
23070 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
23080 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
23090 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
230a0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
230b0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
230c0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
230d0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
230e0 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
230f0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
23100 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
23110 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
23120 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
23130 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
23140 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
23150 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
23160 7b 0a 20 20 20 20 20 20 64 65 66 72 61 67 6d 65  {.      defragme
23170 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
23180 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
23190 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
231a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
231b0 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
231c0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
231d0 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
231e0 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
231f0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
23200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
23210 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
23220 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
23230 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
23240 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
23250 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
23260 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
23270 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
23280 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
23290 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
232a0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
232b0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
232c0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
232d0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
232e0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
232f0 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
23300 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
23310 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
23320 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23330 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
23340 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
23350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23360 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
23370 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
23380 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
23390 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
233a0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
233b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
233c0 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
233d0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
233e0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
233f0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
23400 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
23410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
23420 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23440 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23450 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23470 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23480 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
23490 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
234a0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
234b0 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
234c0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
234d0 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
234e0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
234f0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
23500 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
23510 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
23520 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
23530 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
23540 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
23550 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
23560 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
23570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
235a0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
235b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
235c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
235d0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
235e0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
235f0 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
23600 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
23610 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
23620 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
23630 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
23640 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
23650 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
23660 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
23670 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
23680 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
23690 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
236a0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
236b0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
236c0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
236d0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
236e0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
236f0 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
23700 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
23710 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
23720 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
23730 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
23740 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
23750 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23760 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
23770 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
23780 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
23790 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
237a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
237b0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
237c0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
237d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
237e0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
237f0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
23800 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
23810 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
23820 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
23830 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
23840 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
23850 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
23860 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
23870 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
23880 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23890 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
238a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
238b0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
238c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
238d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
238e0 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
238f0 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
23900 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
23910 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
23920 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
23930 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
23940 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
23950 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
23960 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
23970 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
23980 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23990 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
239a0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
239b0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
239c0 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
239d0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
239e0 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
239f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
23a00 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
23a10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23a20 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
23a30 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
23a40 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
23a50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23a60 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
23a70 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23a80 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
23a90 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
23aa0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
23ab0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
23ac0 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
23ad0 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
23ae0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
23af0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
23b00 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
23b10 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
23b20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
23b30 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
23b40 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
23b50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23b60 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
23b70 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
23b80 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
23b90 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
23ba0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
23bb0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
23bc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
23bd0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
23be0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
23bf0 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
23c00 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
23c10 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
23c20 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
23c30 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
23c40 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
23c50 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
23c60 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
23c70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
23c80 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23c90 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
23ca0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
23cb0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
23cc0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
23cd0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
23ce0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
23cf0 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
23d00 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
23d10 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
23d20 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
23d30 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
23d40 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
23d50 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
23d60 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
23d70 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
23d80 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
23d90 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
23da0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
23db0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23dd0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
23de0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23df0 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
23e00 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
23e10 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
23e20 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
23e30 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
23e40 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
23e50 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
23e60 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
23e70 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a  Cursor*, int);..
23e80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23e90 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
23ea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
23eb0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
23ec0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
23ed0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
23ee0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
23ef0 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
23f00 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
23f10 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
23f20 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
23f30 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
23f40 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
23f50 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
23f60 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
23f70 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
23f80 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
23f90 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
23fa0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
23fb0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
23fc0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
23fd0 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
23fe0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
23ff0 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
24000 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
24010 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
24020 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
24030 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
24040 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
24050 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
24060 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
24070 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
24080 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
24090 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
240a0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
240b0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
240c0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
240d0 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
240e0 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
240f0 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
24100 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
24110 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
24120 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
24130 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
24140 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
24150 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
24160 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
24170 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
24180 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
24190 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
241a0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
241b0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
241c0 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  k(BtCursor *pCur
241d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
241e0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
241f0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
24200 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
24210 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   u16 szCell;.  C
24220 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24240 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24250 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65  ur->iPage];.  Me
24260 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
24270 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24280 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
24290 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
242a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
242b0 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
242c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
242d0 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
242e0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
242f0 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
24300 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
24310 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
24320 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
24330 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
24340 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
24350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24360 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
24370 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
24380 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24390 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
243a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
243b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
243c0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
243d0 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
243e0 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
243f0 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
24400 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
24410 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
24420 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
24430 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
24440 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
24450 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
24460 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
24470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24480 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
24490 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
244a0 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  .    szCell = ce
244b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
244c0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7a 65 72   pCell);.    zer
244d0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
244e0 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
244f0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
24500 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
24510 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  &szCell);.    pP
24520 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
24530 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50   0;.  .    /* pP
24540 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
24550 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
24560 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
24570 6e 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  nge this.    ** 
24580 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
24590 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
245a0 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
245b0 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20  d above and.    
245c0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
245d0 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
245e0 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ild. .    **.   
245f0 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
24600 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
24610 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
24620 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
24630 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ell().    ** may
24640 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
24650 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
24660 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
24670 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
24680 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f      ** one or mo
24690 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
246a0 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65  s. Since an inte
246b0 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65  rnal table B-Tre
246c0 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d  e cell .    ** m
246d0 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
246e0 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
246f0 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
24700 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
24710 20 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69     ** 13 bytes i
24720 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
24730 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
24740 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
24750 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  n code..    **. 
24760 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
24770 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
24780 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
24790 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
247a0 67 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  ge.    ** being 
247b0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
247c0 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
247d0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
247e0 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  oes not .    ** 
247f0 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
24800 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
24810 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
24820 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20  rn code too..   
24830 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
24850 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
24860 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
24870 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
24880 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
24890 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
248a0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
248b0 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  ;.    fillInCell
248c0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
248d0 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
248e0 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
248f0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61  rentSize);.    a
24900 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
24910 65 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65  e<64 );.    asse
24920 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
24930 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
24940 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
24950 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
24960 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
24970 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
24980 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
24990 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
249a0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
249b0 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
249c0 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
249d0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
249e0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
249f0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24a00 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
24a10 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
24a20 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24a30 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
24a40 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
24a50 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
24a60 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
24a70 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
24a80 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
24a90 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
24aa0 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
24ab0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24ac0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
24ad0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
24ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
24af0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
24b00 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
24b10 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
24b20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24b40 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
24b50 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
24b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24b70 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
24b80 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
24b90 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
24ba0 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
24bb0 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
24bc0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
24bd0 74 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72  t the pPage->nFr
24be0 65 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  ee variable is n
24bf0 6f 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ot set correctly
24c00 20 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65   with.  ** respe
24c10 63 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ct to the conten
24c20 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62  t of the page (b
24c30 65 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65  ecause it was se
24c40 74 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20  t to 0 by .  ** 
24c50 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20  insertCell). So 
24c60 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
24c70 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d  eInitPage() to m
24c80 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20  ake sure it is. 
24c90 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   ** correct..  *
24ca0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20  *.  ** This has 
24cb0 74 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20  to be done even 
24cc0 69 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c  if an error will
24cd0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f   be returned. No
24ce0 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20  rmally, if.  ** 
24cf0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24d00 64 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61  during tree bala
24d10 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65  ncing, the conte
24d20 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
24d30 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f  re.  ** not impo
24d40 72 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77  rtant, as they w
24d50 69 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61  ill be recalcula
24d60 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67  ted when the pag
24d70 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  e is rolled.  **
24d80 20 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c   back. But here,
24d90 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   in balance_quic
24da0 6b 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  k(), it is possi
24db0 62 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68  ble that pPage h
24dc0 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74  as .  ** not yet
24dd0 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72   been marked dir
24de0 74 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e  ty or written in
24df0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
24e00 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20  ile. Therefore. 
24e10 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   ** it will not 
24e20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
24e30 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f  nd so it is impo
24e40 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75  rtant to make su
24e50 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
24e60 20 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63   page data and c
24e70 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61  ontents of MemPa
24e80 67 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e  ge are consisten
24e90 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d  t..  */.  pPage-
24ea0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  >isInit = 0;.  s
24eb0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
24ec0 61 67 65 28 70 50 61 67 65 29 3b 0a 0a 20 20 2f  age(pPage);..  /
24ed0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
24ee0 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20  else succeeded, 
24ef0 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
24f00 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a  nt page, in .  *
24f10 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  * case the divid
24f20 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
24f30 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
24f40 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
24f50 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
24f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24f70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
24f80 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  );.    pCur->iPa
24f90 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62  ge--;.    rc = b
24fa0 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
24fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24fc0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
24fd0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
24fe0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
24ff0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25000 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
25010 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
25020 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
25030 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
25040 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
25050 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
25060 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
25070 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
25080 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
25090 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
250a0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
250b0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
250c0 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
250d0 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
250e0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
250f0 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
25100 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
25110 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
25120 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
25130 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
25140 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
25150 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
25160 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
25170 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
25180 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
25190 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
251a0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
251b0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
251c0 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
251d0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
251e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
251f0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
25200 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
25210 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
25220 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
25230 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
25240 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
25250 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
25260 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
25270 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
25280 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
25290 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
252a0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
252b0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
252c0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
252d0 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
252e0 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
252f0 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
25300 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
25310 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
25320 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
25330 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
25340 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
25350 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
25360 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
25370 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
25380 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25390 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
253a0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
253b0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
253c0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
253d0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
253e0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
253f0 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
25400 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
25410 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
25420 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
25430 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
25440 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
25450 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
25460 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
25470 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
25480 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
25490 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
254a0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
254b0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
254c0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
254d0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
254e0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
254f0 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
25500 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
25510 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
25520 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
25530 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
25540 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
25550 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
25560 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
25570 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
25580 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
25590 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
255a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
255b0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
255c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
255d0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
255e0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
255f0 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f  _nonroot(BtCurso
25600 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
25610 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
25620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25630 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c  over or underful
25640 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63  l page to balanc
25650 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
25660 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
25670 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
25680 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
25690 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
256b0 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
256c0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
256d0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
256e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
256f0 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
25700 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
25710 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
25720 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
25730 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
25740 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
25750 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  . */.  int nOld;
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25780 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
25790 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  ] */.  int nNew;
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
257c0 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
257d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25800 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
25810 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
25820 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
25830 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
25840 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
25850 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
25860 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25870 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
25880 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
25890 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
258b0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
258c0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
258d0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
258e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
258f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25900 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
25910 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
25920 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
25930 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
25940 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
25950 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
25960 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
25970 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25980 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
25990 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
259a0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
259b0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
259c0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
259d0 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
259e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
259f0 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
25a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
25a10 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
25a20 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
25a30 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
25a40 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
25a50 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
25a60 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
25a70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
25a80 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
25a90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
25aa0 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
25ab0 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
25ac0 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25ad0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25ae0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
25af0 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69  aSpace2[] */.  i
25b00 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
25b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25b20 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
25b30 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
25b40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
25b50 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25b60 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
25b70 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
25b80 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
25b90 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25ba0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25bb0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
25bc0 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
25bd0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
25be0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
25bf0 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
25c00 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
25c10 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
25c20 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
25c30 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
25c40 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
25c50 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
25c60 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
25c70 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
25c80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
25c90 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
25ca0 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
25cb0 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
25cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25cd0 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
25ce0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
25cf0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
25d00 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
25d10 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
25d20 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
25d30 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
25d40 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
25d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25d60 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
25d70 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
25d80 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
25d90 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
25da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
25db0 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
25dc0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
25dd0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
25de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
25df0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
25e00 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
25e10 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
25e20 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
25e30 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
25e40 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
25e50 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
25e60 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
25e70 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
25e80 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
25e90 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
25ea0 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  ce */.  u8 *aSpa
25eb0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ce2 = 0;       /
25ec0 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72  * Space for over
25ed0 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65  flow dividers ce
25ee0 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  lls after balanc
25ef0 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d  e */.  u8 *aFrom
25f00 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
25f10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25f20 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
25f30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25f40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
25f50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
25f60 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
25f70 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
25f80 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a   1 );..  /* .  *
25f90 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e  * Find the paren
25fa0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
25fb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
25fc0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
25fd0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
25fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25ff0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26000 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
26010 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
26020 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
26030 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
26040 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
26050 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26060 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73  ->iPage-1];.  as
26070 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b  sert( pParent );
26080 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
26090 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
260a0 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
260b0 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  t->pDbPage)) ){.
260c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
260d0 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41   }..  TRACE(("BA
260e0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
260f0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
26100 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
26110 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
26120 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
26130 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
26140 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
26150 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
26160 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
26170 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
26180 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
26190 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
261a0 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
261b0 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
261c0 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
261d0 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
261e0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
261f0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
26200 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
26210 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
26220 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
26230 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
26240 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
26250 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
26260 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
26270 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
26280 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
26290 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
262a0 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
262b0 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
262c0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
262d0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
262e0 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
262f0 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
26300 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
26310 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26  ->nOverflow==1 &
26320 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  &.      pPage->a
26330 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
26340 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20  ge->nCell &&.   
26350 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f     pParent->pgno
26360 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74  !=1 &&.      get
26370 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
26380 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
26390 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50  drOffset+8])==pP
263a0 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20  age->pgno.  ){. 
263b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
263c0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
263d0 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  /*.    ** TODO: 
263e0 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e  Check the siblin
263f0 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  gs to the left o
26400 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20  f pPage. It may 
26410 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  be that.    ** t
26420 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c  hey are not full
26430 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65   and no new page
26440 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
26450 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
26460 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 43  balance_quick(pC
26470 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ur);.  }.#endif.
26480 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
26490 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
264a0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
264b0 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20  >pDbPage)) ){.  
264c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
264d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
264e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
264f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
26500 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
26510 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
26520 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
26530 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
26540 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
26550 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
26560 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
26570 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
26580 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
26590 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
265a0 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
265b0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
265c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
265d0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
265e0 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69  Index(pParent, i
265f0 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  dx, pPage->pgno)
26600 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69  ;..  /*.  ** Ini
26610 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65  tialize variable
26620 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  s so that it wil
26630 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d  l be safe to jum
26640 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  p.  ** directly 
26650 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26660 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74  up at any moment
26670 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20  ..  */.  nOld = 
26680 6e 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a  nNew = 0;..  /*.
26690 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e    ** Find siblin
266a0 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65  g pages to pPage
266b0 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69   and the cells i
266c0 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64  n pParent that d
266d0 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73  ivide.  ** the s
266e0 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74  iblings.  An att
266f0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
26700 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
26710 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   on either.  ** 
26720 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20  side of pPage.  
26730 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
26740 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
26750 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
26760 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68  if.  ** pPage th
26770 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
26780 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
26790 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
267a0 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  .  If pParent.  
267b0 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
267c0 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
267d0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
267e0 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
267f0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76  en..  */.  nxDiv
26800 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69   = idx - NN;.  i
26810 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20  f( nxDiv + NB > 
26820 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
26830 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50  {.    nxDiv = pP
26840 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e  arent->nCell - N
26850 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  B + 1;.  }.  if(
26860 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20   nxDiv<0 ){.    
26870 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20  nxDiv = 0;.  }. 
26880 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72   nDiv = 0;.  for
26890 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69  (i=0, k=nxDiv; i
268a0 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a  <NB; i++, k++){.
268b0 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e      if( k<pParen
268c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
268d0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
268e0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
268f0 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
26900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26910 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
26920 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
26930 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
26940 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
26950 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
26960 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26970 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
26980 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
26990 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
269a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
269b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
269c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
269d0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
269e0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
269f0 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  d[i], &apOld[i])
26a00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
26a10 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26a20 6e 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c  nup;.    /* apOl
26a30 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
26a40 3d 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f  = k; */.    apCo
26a50 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
26a60 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
26a70 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
26a80 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
26a90 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
26aa0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
26ab0 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
26ac0 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
26ad0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
26ae0 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
26af0 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
26b00 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
26b10 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
26b20 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
26b30 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
26b40 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
26b50 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
26b60 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20   */.  szScratch 
26b70 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
26b80 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
26bb0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
26bc0 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
26bf0 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
26c00 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
26c10 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
26c20 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
26c30 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
26c40 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
26c70 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
26c80 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
26c90 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20  ls : 0);        
26ca0 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
26cb0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
26cc0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
26cd0 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
26ce0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
26cf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
26d00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
26d10 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26d20 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
26d30 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
26d40 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
26d50 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
26d60 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
26d70 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
26d80 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
26d90 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
26da0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
26db0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
26dc0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
26dd0 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
26de0 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
26df0 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
26e00 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
26e10 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
26e20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26e30 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
26e40 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
26e50 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
26e60 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
26e70 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
26e80 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
26e90 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
26ea0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
26eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
26ec0 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43  pace1 - (u8*)apC
26ed0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
26ee0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
26ef0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
26f00 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
26f10 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  UM ){.    aFrom 
26f20 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
26f30 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20  pageSize];.  }. 
26f40 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74   aSpace2 = sqlit
26f50 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74  e3PageMalloc(pBt
26f60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
26f70 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b  f( aSpace2==0 ){
26f80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26f90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
26fa0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
26fb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
26fc0 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
26fd0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
26fe0 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
26ff0 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
27000 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
27010 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
27020 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
27030 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
27040 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
27050 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
27060 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
27070 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
27080 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
27090 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
270a0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
270b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
270c0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
270d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
270e0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
270f0 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a  Page*)aCopy[i];.
27100 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70      memcpy(p, ap
27110 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
27120 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d  emPage));.    p-
27130 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
27140 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  &p[1];.    memcp
27150 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
27160 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
27170 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
27180 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
27190 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
271a0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
271b0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
271c0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
271d0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
271e0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
271f0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
27200 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
27210 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
27220 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
27230 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
27240 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
27250 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
27260 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
27270 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
27280 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
27290 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
272a0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
272b0 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
272c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
272d0 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
272e0 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
272f0 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
27300 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
27310 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
27320 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
27330 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
27340 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
27350 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
27360 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
27370 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
27380 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
27390 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
273a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
273b0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
273c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
273d0 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
273e0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
273f0 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
27400 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
27410 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
27420 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
27430 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
27440 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
27450 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
27460 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
27470 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
27480 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
27490 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
274a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
274b0 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
274c0 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  ge->hasData;.  f
274d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
274e0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
274f0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
27500 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
27510 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
27520 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
27530 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
27540 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
27550 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
27560 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
27570 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
27580 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
27590 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
275a0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
275b0 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
275c0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
275d0 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66  Cell]);.      if
275e0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
275f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
27600 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
27610 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20  Cell] = i;.     
27620 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
27630 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
27640 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
27650 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
27660 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
27670 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
27680 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
27690 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
276a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
276b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
276c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
276d0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
276e0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
276f0 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
27700 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
27710 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
27720 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
27730 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
27740 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
27750 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
27760 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
27770 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
27780 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
27790 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
277a0 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
277b0 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
277c0 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
277d0 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
277e0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
277f0 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
27800 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
27810 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
27820 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
27830 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
27840 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
27850 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
27860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27870 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
27880 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
27890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
278a0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
278b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
278c0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
278d0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
278e0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
278f0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
27900 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
27910 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
27920 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
27930 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
27940 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
27950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
27960 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
27970 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
27980 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
27990 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
279a0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
279b0 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
279c0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
279d0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
279e0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
279f0 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27a00 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
27a10 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
27a20 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
27a30 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  , sz);.        s
27a40 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
27a50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27a70 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
27a80 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
27a90 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
27aa0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
27ab0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
27ac0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
27ad0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
27ae0 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
27af0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
27b00 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
27b10 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
27b20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
27b30 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
27b40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
27b50 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
27b60 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
27b70 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
27b80 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
27b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27ba0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
27bb0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
27bc0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43           if( szC
27bd0 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
27be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27bf0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
27c00 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
27c10 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
27c20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c             szCel
27c30 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
27c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27c50 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c    }.        nCel
27c60 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
27c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
27c80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
27c90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
27ca0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
27cb0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
27cc0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
27cd0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
27ce0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
27cf0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
27d00 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
27d10 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
27d20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
27d30 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
27d40 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
27d50 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
27d60 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
27d70 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
27d80 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
27d90 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
27da0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
27db0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
27dc0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
27dd0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
27de0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
27df0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
27e00 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
27e10 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
27e20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
27e30 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
27e40 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
27e50 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
27e60 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
27e70 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
27e80 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
27e90 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
27ea0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
27eb0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
27ec0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
27ed0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
27ee0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
27ef0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
27f00 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
27f10 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
27f20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
27f30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
27f40 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
27f50 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
27f60 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
27f70 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
27f80 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
27f90 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
27fa0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
27fb0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
27fc0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
27fd0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
27fe0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
27ff0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
28000 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
28010 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
28020 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
28030 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
28040 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
28050 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
28060 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
28070 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
28080 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
28090 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
280a0 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
280b0 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
280c0 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
280d0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
280e0 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
280f0 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
28100 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
28110 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
28120 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
28130 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
28140 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
28150 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
28160 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
28170 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
28180 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
28190 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
281a0 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
281b0 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
281c0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
281d0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
281e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
281f0 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
28200 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
28210 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
28220 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
28230 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
28240 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
28250 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
28260 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
28270 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
28280 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
28290 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
282a0 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
282b0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
282c0 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
282d0 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
282e0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
282f0 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
28300 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
28310 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
28320 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
28330 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
28340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28350 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
28360 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
28370 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
28380 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
28390 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
283a0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
283b0 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
283c0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
283d0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
283e0 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
283f0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
28400 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
28410 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
28420 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
28430 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
28440 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
28450 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
28460 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
28470 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
28480 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
28490 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
284a0 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
284b0 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
284c0 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
284d0 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
284e0 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
284f0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
28500 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
28510 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
28520 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
28530 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
28540 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
28550 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
28560 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
28570 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20  ew[0])>0) or we 
28580 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76  are the.  ** a v
28590 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
285a0 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
285b0 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
285c0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
285d0 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
285e0 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
285f0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
28600 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
28610 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
28620 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
28630 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
28640 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
28650 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
28660 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
28670 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
28680 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
28690 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
286a0 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
286b0 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20   );.  pageFlags 
286c0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  = pPage->aData[0
286d0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
286e0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
286f0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
28700 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
28710 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
28720 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
28730 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
28740 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20   = pgnoOld[i];. 
28750 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
28760 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
28770 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28780 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
28790 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
287a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
287b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
287c0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
287d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
287e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
287f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
28800 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
28810 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77  oNew[i], pgnoNew
28820 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [i-1], 0);.     
28830 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
28840 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28850 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
28860 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
28870 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  w++;.    }.  }..
28880 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
28890 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
288a0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
288b0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
288c0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
288d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
288e0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
288f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28900 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28910 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
28920 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
28930 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
28940 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
28950 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
28960 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
28970 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
28980 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
28990 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
289a0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
289b0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
289c0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
289d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
289e0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
289f0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
28a00 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
28a10 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
28a20 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
28a30 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
28a40 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
28a50 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
28a60 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
28a70 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
28a80 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
28a90 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
28aa0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
28ab0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
28ac0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
28ad0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
28ae0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
28af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
28b00 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
28b10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
28b20 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
28b30 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
28b40 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
28b50 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
28b60 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
28b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
28b80 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
28b90 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
28ba0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
28bb0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
28bc0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
28bd0 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
28be0 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
28bf0 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
28c00 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
28c10 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
28c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28c30 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
28c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
28c50 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
28c60 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
28c70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
28c80 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
28c90 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
28ca0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
28cb0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
28cc0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
28cd0 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
28ce0 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
28cf0 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
28d00 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
28d10 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
28d20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
28d30 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
28d40 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
28d50 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
28d60 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
28d70 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
28d80 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
28d90 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
28da0 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
28db0 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
28dc0 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
28dd0 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
28de0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
28df0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
28e00 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
28e10 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
28e20 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
28e30 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
28e40 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
28e50 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
28e60 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
28e70 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
28e80 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
28e90 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
28ea0 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
28eb0 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
28ec0 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
28ed0 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
28ee0 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
28ef0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
28f00 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
28f10 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
28f20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28f30 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
28f40 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
28f50 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
28f60 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
28f70 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
28f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
28f90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28fa0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
28fb0 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
28fc0 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
28fd0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
28fe0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
28ff0 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
29000 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
29010 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
29020 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
29030 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
29040 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
29050 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
29060 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
29070 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
29080 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
29090 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
290a0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
290b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
290c0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
290d0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
290e0 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
290f0 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
29100 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
29110 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
29120 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
29130 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
29140 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
29150 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
29160 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
29170 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
29180 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
29190 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  M ){.      for(k
291a0 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
291b0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
291c0 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
291d0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
291e0 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
291f0 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
29200 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
29210 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
29220 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29230 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
29240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29260 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  & leafCorrection
29270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29280 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29290 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
292a0 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d  apCell[k]), PTRM
292b0 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
292c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
292d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
292e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
292f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
29300 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29310 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
29320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29330 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d  }.    }..    j =
29340 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
29350 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
29360 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
29370 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
29380 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
29390 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
293a0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
293b0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
293c0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
293d0 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
293e0 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
293f0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
29400 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
29410 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
29420 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
29430 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
29440 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
29450 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
29460 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
29470 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
29480 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
29490 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a  pace2[iSpace2];.
294a0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
294b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
294c0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
294d0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
294e0 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
294f0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20  ISAUTOVACUUM .  
29500 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d         && (aFrom
29510 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [j]==0xFF || apC
29520 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70  opy[aFrom[j]]->p
29530 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29  gno!=pNew->pgno)
29540 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
29550 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29560 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
29570 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41  te(pCell), PTRMA
29580 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
29590 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
295a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
295b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
295c0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
295d0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
295e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
295f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
29600 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
29610 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
29620 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
29630 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
29640 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
29650 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
29660 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
29670 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
29680 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
29690 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
296a0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
296b0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
296c0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
296d0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
296e0 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
296f0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
29700 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
29710 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
29720 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
29730 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
29740 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
29750 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
29760 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
29770 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
29780 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
29790 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
297a0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
297b0 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
297c0 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
297d0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
297e0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
297f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29800 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
29810 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
29820 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
29830 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
29840 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
29850 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
29860 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
29870 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
29880 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
29890 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
298a0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
298b0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
298c0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
298d0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
298e0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
298f0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
29900 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
29910 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
29920 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
29930 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
29940 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
29950 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
29960 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
29970 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
29980 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
29990 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
299a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
299b0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
299c0 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
299d0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
299e0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
299f0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
29a00 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
29a10 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
29a20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
29a30 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
29a40 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
29a50 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
29a60 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
29a70 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
29a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
29a90 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
29aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
29ab0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
29ac0 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
29ad0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
29ae0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
29af0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29b00 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63     }.      iSpac
29b10 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e2 += sz;.      
29b20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
29b30 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
29b40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
29b50 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace2<=pBt->pageS
29b60 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
29b70 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
29b80 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
29b90 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34  ll, sz, pTemp, 4
29ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
29bc0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29bd0 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  p;.      put4byt
29be0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
29bf0 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
29c00 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
29c10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
29c20 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
29c30 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
29c40 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
29c50 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
29c60 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
29c70 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
29c80 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
29c90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
29ca0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
29cb0 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
29cc0 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
29cd0 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
29ce0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
29cf0 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
29d00 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
29d10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29d20 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
29d30 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
29d40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29d60 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29d70 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
29d80 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
29d90 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
29da0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
29db0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29dc0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
29dd0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
29de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
29df0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
29e00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29e10 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
29e20 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
29e30 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
29e40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29e60 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
29e70 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
29e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
29e90 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
29ea0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
29eb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
29ec0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
29ed0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
29ee0 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
29ef0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
29f00 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
29f10 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
29f20 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
29f30 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
29f40 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
29f50 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
29f60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
29f70 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
29f80 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
29f90 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
29fa0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
29fb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
29fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29fd0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
29fe0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
29ff0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a000 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  ( nxDiv==pParent
2a010 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d  ->nCell+pParent-
2a020 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2a030 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2a040 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72  sibling is the r
2a050 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2a060 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  of pParent */.  
2a070 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2a080 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2a090 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2a0a0 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2a0b0 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
2a0c0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2a0d0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65  ibling is the le
2a0e0 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ft child of the 
2a0f0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70  first entry in p
2a100 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61  Parent.    ** pa
2a110 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  st the right-mos
2a120 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20  t divider entry 
2a130 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2a140 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2a150 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2a160 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2a170 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ]);.  }..  /*.  
2a180 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70  ** Balance the p
2a190 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74  arent page.  Not
2a1a0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  e that the curre
2a1b0 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20  nt page (pPage) 
2a1c0 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20  might.  ** have 
2a1d0 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
2a1e0 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74  e freelist so it
2a1f0 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72   might no longer
2a200 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2a210 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61  .  ** But the pa
2a220 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61  rent page will a
2a230 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c  lways be initial
2a240 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ized..  */.  ass
2a250 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
2a260 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65  Init );.  sqlite
2a270 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2a280 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  ell);.  apCell =
2a290 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
2a2a0 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
2a2b0 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20  ->iPage--;.  rc 
2a2c0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2a2d0 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
2a2e0 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
2a2f0 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
2a300 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
2a310 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
2a320 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73  ee(aSpace2);.  s
2a330 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2a340 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
2a350 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2a360 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2a370 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2a380 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a390 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2a3a0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
2a3b0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w[i]);.  }..  /*
2a3c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2a3d0 72 65 6e 74 29 3b 20 2a 2f 0a 20 20 54 52 41 43  rent); */.  TRAC
2a3e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2a3f0 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2a400 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2a410 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2a420 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2a430 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2a440 6c 6c 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ll));..  return 
2a450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2a470 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2a480 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2a490 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2a4a0 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2a4b0 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2a4c0 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2a4d0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2a4e0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2a4f0 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2a500 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2a510 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74  nce_shallower(Bt
2a520 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a530 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a550 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d   Root page of B-
2a560 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  Tree */.  MemPag
2a570 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
2a580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
2a590 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
2a5a0 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
2a5b0 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
2a5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2a5d0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
2a5e0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
2a5f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a600 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a610 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
2a620 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
2a630 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2a640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a650 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
2a660 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
2a670 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
2a680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2a690 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
2a6a0 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
2a6b0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
2a6e0 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
2a6f0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2a700 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2a710 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2a720 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2a730 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
2a740 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2a750 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
2a760 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a  ur->apPage[0];..
2a770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a780 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2a790 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a7a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a7b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a7c0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a7d0 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50  Bt;.  mxCellPerP
2a7e0 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42  age = MX_CELL(pB
2a7f0 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73  t);.  apCell = s
2a800 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78  qlite3Malloc( mx
2a810 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
2a820 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
2a830 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61  u16)) );.  if( a
2a840 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
2a850 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a860 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2a870 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
2a880 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
2a890 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2a8a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
2a8b0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
2a8c0 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
2a8d0 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
2a8e0 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
2a8f0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
2a900 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2a910 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2a920 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
2a930 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
2a940 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
2a950 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
2a960 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
2a970 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2a980 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
2a990 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
2a9a0 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
2a9b0 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
2a9c0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2a9d0 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
2a9e0 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
2a9f0 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
2aa00 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
2aa10 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
2aa20 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
2aa30 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
2aa40 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
2aa50 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
2aa60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2aa70 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
2aa80 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
2aa90 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
2aaa0 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2aab0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
2aac0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
2aad0 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
2aae0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
2aaf0 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
2ab00 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
2ab10 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
2ab20 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
2ab30 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
2ab40 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
2ab50 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
2ab60 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
2ab70 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
2ab80 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
2ab90 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
2aba0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43      VVA_ONLY( pC
2abb0 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
2abc0 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e  d = 1 );.    pgn
2abd0 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74  oChild = get4byt
2abe0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2abf0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2ac00 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
2ac10 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b  ( pgnoChild>0 );
2ac20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2ac30 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67  oChild<=pagerPag
2ac40 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42  ecount(pPage->pB
2ac50 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
2ac60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ac70 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65  reeGetPage(pPage
2ac80 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  ->pBt, pgnoChild
2ac90 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20  , &pChild, 0);. 
2aca0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2acb0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2acc0 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
2acd0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
2ace0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2acf0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2ad00 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69  pChild);.      i
2ad10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2ad20 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2ad30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ad40 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2ad50 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
2ad60 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
2ad70 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
2ad80 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
2ad90 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
2ada0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
2adb0 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
2adc0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
2add0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2ade0 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
2adf0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2ae00 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2ae10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2ae20 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2ae30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
2ae40 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
2ae50 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
2ae60 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
2ae70 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2ae80 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
2ae90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2aea0 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
2aeb0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2aec0 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
2aed0 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
2aee0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
2aef0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
2af00 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
2af10 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2af20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2af30 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2af40 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
2af50 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
2af60 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
2af70 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
2af80 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2af90 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2afa0 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
2afb0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2afc0 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
2afd0 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
2afe0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2aff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b000 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2b010 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
2b020 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
2b030 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
2b040 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
2b050 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
2b060 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
2b070 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
2b080 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2b090 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
2b0a0 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
2b0b0 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
2b0c0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
2b0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2b0e0 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
2b0f0 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
2b100 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
2b110 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
2b120 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2b130 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2b140 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2b150 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2b160 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2b170 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2b180 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2b190 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2b1a0 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2b1b0 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2b1c0 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2b1e0 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2b1f0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2b200 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b210 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2b220 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
2b230 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2b240 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
2b250 6d 61 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20  maps(pPage);.   
2b260 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
2b270 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2b280 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2b290 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
2b2a0 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
2b2b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2b2c0 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
2b2d0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
2b2e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
2b2f0 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
2b300 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
2b310 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
2b320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
2b330 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
2b340 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
2b350 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2b360 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
2b370 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
2b380 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2b390 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2b3a0 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2b3b0 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2b3c0 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2b3d0 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2b3e0 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2b3f0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2b400 65 65 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a  eeper(BtCursor *
2b410 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b430 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2b440 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2b450 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2b460 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  age;     /* Poin
2b470 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ter to the root 
2b480 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
2b490 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
2b4a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
2b4b0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2b4c0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2b4d0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
2b4e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
2b4f0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2b500 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2b510 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2b520 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2b530 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  bleSize;     /* 
2b540 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a  Total usable siz
2b550 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20  e of a page */. 
2b560 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2b570 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2b580 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2b590 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74  ge */.  u8 *cdat
2b5a0 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  a;          /* C
2b5b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68  ontent of the ch
2b5c0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ild page */.  in
2b5d0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
2b5e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
2b5f0 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61  age header in pa
2b600 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rent */.  int cb
2b610 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rk;           /*
2b620 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65   Offset to conte
2b630 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  nt of first cell
2b640 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20   in parent */.. 
2b650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b660 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
2b670 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2b680 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  e[0]->nOverflow>
2b690 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  0 );..  VVA_ONLY
2b6a0 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
2b6b0 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70  ffled = 1 );.  p
2b6c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2b6d0 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20  age[0];.  pBt = 
2b6e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
2b6f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b700 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2b710 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61  tex) );.  rc = a
2b720 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2b730 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26  (pBt, &pChild, &
2b740 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65  pgnoChild, pPage
2b750 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66  ->pgno, 0);.  if
2b760 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b770 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b780 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b790 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
2b7a0 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  age) );.  usable
2b7b0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2b7c0 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
2b7d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2b7e0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2b7f0 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20  rOffset;.  cbrk 
2b800 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2b810 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
2b820 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
2b830 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
2b840 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
2b850 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b860 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
2b870 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
2b880 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  cdata[cbrk], &da
2b890 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ta[cbrk], usable
2b8a0 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 20 20 0a 20  Size-cbrk);.  . 
2b8b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2b8c0 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2b8d0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2b8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2b8f0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65  nt nCopy = pPage
2b900 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2b910 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2b920 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0]);.    memcpy(
2b930 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
2b940 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f  Page->aOvfl, nCo
2b950 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d  py);.    pChild-
2b960 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
2b970 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
2b980 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2b990 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2b9a0 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2b9b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
2b9c0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2b9d0 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2b9e0 6c 6c 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ll );.    zeroPa
2b9f0 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2ba00 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
2ba10 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70 75 74  F_LEAF);.    put
2ba20 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2ba30 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2ba40 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
2ba50 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  ld);.    TRACE((
2ba60 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
2ba70 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
2ba80 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2ba90 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2baa0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2bab0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2bac0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2bad0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
2bae0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2baf0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
2bb00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bb10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bb20 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
2bb30 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  aps(pChild);.   
2bb40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2bb50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bb60 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
2bb70 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43  >iPage++;.    pC
2bb80 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20  ur->apPage[1] = 
2bb90 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72  pChild;.    pCur
2bba0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
2bbb0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2bbc0 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a  _nonroot(pCur);.
2bbd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
2bbe0 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2bbf0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2bc00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
2bc10 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
2bc20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2bc30 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
2bc40 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
2bc50 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
2bc60 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
2bc70 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
2bc80 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
2bc90 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
2bca0 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
2bcb0 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
2bcc0 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
2bcd0 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
2bce0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
2bcf0 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65  Parameter isInse
2bd00 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 20  rt is true if a 
2bd10 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  new cell was jus
2bd20 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
2bd30 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20  the.** page, or 
2bd40 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2bd50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2bd60 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
2bd70 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73  *pCur, int isIns
2bd80 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
2bd90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2bda0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2bdb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bdc0 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73  ->iPage];..  ass
2bdd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2bde0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2bdf0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2be00 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2be10 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2be20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2be30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2be40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2be50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2be60 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
2be70 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2be80 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72 29  nce_deeper(pCur)
2be90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2bea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2beb0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2bec0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2bed0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2bee0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2bef0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2bf00 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2bf10 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21  0 || .        (!
2bf20 69 73 49 6e 73 65 72 74 20 26 26 20 70 50 61 67  isInsert && pPag
2bf30 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
2bf40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2bf50 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
2bf60 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2bf70 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  ot(pCur);.    }.
2bf80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bf90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2bfa0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2bfb0 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2bfc0 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2bfd0 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2bfe0 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2bff0 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2c000 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2c010 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2c020 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2c030 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2c040 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2c050 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2c060 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2c070 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2c080 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2c090 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2c0a0 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2c0b0 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2c0c0 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2c0d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2c0e0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2c0f0 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
2c100 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
2c110 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
2c120 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
2c130 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20  Flag==1 and .** 
2c140 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2c150 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e  ==1 are also con
2c160 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63  sidered 'read' c
2c170 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e  ursors. Incremen
2c180 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72  tal .** blob cur
2c190 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
2c1a0 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
2c1b0 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
2c1c0 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
2c1d0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
2c1e0 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
2c1f0 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
2c200 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
2c210 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
2c220 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
2c230 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2c240 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
2c250 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
2c260 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
2c270 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
2c280 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
2c290 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2c2a0 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
2c2b0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2c2c0 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2c2d0 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
2c2e0 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
2c2f0 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
2c300 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
2c310 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
2c320 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
2c330 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2c340 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
2c350 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
2c360 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
2c370 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
2c380 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
2c390 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2c3a0 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
2c3b0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
2c3c0 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
2c3d0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2c3e0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
2c3f0 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
2c400 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2c410 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
2c420 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
2c430 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
2c440 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
2c450 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
2c460 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2c470 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
2c480 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
2c490 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
2c4a0 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
2c4b0 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
2c4c0 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
2c4d0 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
2c4e0 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
2c4f0 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
2c500 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
2c510 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
2c520 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
2c530 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2c540 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
2c550 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
2c560 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2c570 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
2c580 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
2c590 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2c5a0 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
2c5b0 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
2c5c0 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
2c5d0 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
2c5e0 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
2c5f0 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2c600 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
2c610 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2c620 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70  ocks(.  Btree *p
2c630 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70  Btree, .  Pgno p
2c640 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75  gnoRoot, .  BtCu
2c650 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a  rsor *pExclude,.
2c660 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20    i64 iRow.){.  
2c670 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2c680 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2c690 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2c6a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2c6b0 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2c6c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2c6d0 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2c6e0 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2c6f0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2c700 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2c710 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2c720 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c730 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2c740 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2c750 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2c760 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2c770 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2c780 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2c790 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2c7a0 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2c7b0 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2c7c0 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2c7d0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2c7e0 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2c7f0 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2c800 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2c810 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2c820 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2c830 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2c840 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c850 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c860 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2c870 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2c880 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2c890 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2c8a0 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2c8b0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2c8c0 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2c8d0 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2c8e0 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
2c8f0 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
2c900 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
2c910 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
2c920 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
2c930 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
2c940 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2c950 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2c960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c970 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2c980 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c990 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2c9a0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2c9b0 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2c9c0 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2c9d0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2c9e0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2c9f0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2ca00 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2ca10 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2ca20 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2ca30 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2ca40 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2ca50 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2ca60 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2ca70 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2ca80 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2ca90 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2caa0 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2cab0 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2cac0 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2cad0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2cae0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2caf0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2cb00 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2cb10 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2cb20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2cb30 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2cb40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2cb60 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2cb70 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2cb80 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2cb90 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2cba0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2cbb0 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2cbc0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2cbd0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2cbe0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2cbf0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2cc00 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2cc10 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2cc40 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2cc50 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2cc60 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc80 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2cc90 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2cca0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2ccb0 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2ccc0 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69    int szNew;.  i
2ccd0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2cce0 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
2ccf0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2cd00 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2cd10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2cd20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2cd30 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
2cd40 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
2cd50 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
2cd60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2cd70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
2cd80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2cd90 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2cda0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2cdb0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2cdc0 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2cdd0 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
2cde0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2cdf0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2ce00 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2ce10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
2ce20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2ce30 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2ce40 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43  nly );.  if( !pC
2ce50 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
2ce60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce70 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f  PERM;   /* Curso
2ce80 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77  r not open for w
2ce90 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2cea0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2ceb0 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2cec0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2ced0 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a   pCur, nKey) ){.
2cee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cef0 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2cf00 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2cf10 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2cf20 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69   lock */.  }.  i
2cf30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2cf40 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2cf50 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
2cf60 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ->skip;.  }..  /
2cf70 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2cf80 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
2cf90 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
2cfa0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
2cfb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
2cfc0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
2cfd0 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
2cfe0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2cff0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2d000 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2d010 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
2d020 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2d030 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2d040 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
2d050 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
2d060 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
2d070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d080 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d090 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d0a0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2d0b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
2d0c0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
2d0d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2d0e0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
2d0f0 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28  Key );.  TRACE((
2d100 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
2d110 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
2d120 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
2d130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
2d140 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
2d150 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
2d160 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
2d170 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
2d180 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
2d190 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
2d1a0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2d1b0 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
2d1c0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
2d1d0 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
2d1e0 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
2d1f0 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2d200 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d210 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2d220 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2d230 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2d240 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
2d250 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
2d260 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2d270 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
2d280 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
2d290 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
2d2a0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2d2b0 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
2d2c0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2d2d0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2d2e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d2f0 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2d300 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2d310 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2d320 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
2d330 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
2d340 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2d350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d360 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d370 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d380 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
2d390 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2d3a0 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
2d3b0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2d3c0 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28  e, idx);.    if(
2d3d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d3e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2d3f0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2d400 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2d410 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2d420 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2d430 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2d440 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2d450 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2d460 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2d470 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2d480 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a  l(pPage, idx, sz
2d490 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Old);.  }else if
2d4a0 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
2d4b0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2d4c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d4d0 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20  leaf );.    idx 
2d4e0 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2d4f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d500 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d510 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
2d520 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
2d530 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2d540 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2d550 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  f );.  }.  rc = 
2d560 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2d570 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
2d580 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
2d590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d5a0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  K ) goto end_ins
2d5b0 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  ert;.  rc = bala
2d5c0 6e 63 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  nce(pCur, 1);.  
2d5d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d5e0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2d5f0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65  oot(pCur);.  }.e
2d600 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74  nd_insert:.  ret
2d610 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d620 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
2d630 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
2d640 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2d650 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2d660 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2d670 67 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79  g at a arbitrary
2d680 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
2d690 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
2d6a0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
2d6b0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2d6c0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2d6d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d6e0 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  e];.  int idx;. 
2d6f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d700 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  pCell;.  int rc;
2d710 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2d720 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a  d = 0;.  Btree *
2d730 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2d740 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2d750 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2d760 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2d770 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2d780 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d790 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2d7a0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2d7b0 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2d7c0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2d7d0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2d7e0 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2d7f0 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  g a delete */.  
2d800 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2d810 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2d820 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2d830 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2d840 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2d850 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2d860 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ly );.  if( pCur
2d870 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d880 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
2d890 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
2d8a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2d8b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d8c0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2d8d0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
2d8e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
2d8f0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
2d900 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
2d910 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
2d920 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46    if( !pCur->wrF
2d930 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
2d940 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
2d950 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e   /* Did not open
2d960 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72   this cursor for
2d970 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2d980 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2d990 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2d9a0 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2d9b0 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69  t, pCur, pCur->i
2d9c0 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20  nfo.nKey) ){.   
2d9d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2d9e0 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
2d9f0 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
2da00 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
2da10 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
2da20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
2da30 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2da40 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
2da50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2da60 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
2da70 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
2da80 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
2da90 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2daa0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2dab0 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
2dac0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
2dad0 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
2dae0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
2daf0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  the page.  ** th
2db00 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c  at the entry wil
2db10 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  l be deleted fro
2db20 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  m..  */.  if( . 
2db30 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65     (rc = restore
2db40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2db50 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2db60 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2db70 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
2db80 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
2db90 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2dba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2dbb0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2dbc0 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
2dbd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2dbe0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
2dbf0 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20  cell within its 
2dc00 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
2dc10 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
2dc20 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
2dc30 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
2dc40 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
2dc50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
2dc60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2dc70 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
2dc80 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
2dc90 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
2dca0 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
2dcb0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2dcc0 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  ge];.  pCell = f
2dcd0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2dce0 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
2dcf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2dd00 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2dd10 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
2dd20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2dd30 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2dd40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dd50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2dd60 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2dd70 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2dd80 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2dd90 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2dda0 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2ddb0 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2ddc0 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2ddd0 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2dde0 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2ddf0 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2de00 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2de10 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2de20 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2de30 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2de40 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2de50 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2de60 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2de70 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2de80 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2de90 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2dea0 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2deb0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2dec0 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2ded0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2dee0 4c 65 61 66 50 61 67 65 3b 0a 0a 20 20 20 20 75  LeafPage;..    u
2def0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2df00 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
2df10 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
2df20 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
2df30 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
2df40 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  t( !pPage->intKe
2df50 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
2df60 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
2df70 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2df80 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2df90 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2dfa0 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2dfb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2dfc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfd0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
2dfe0 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e  r.aiIdx[leafCur.
2dff0 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20  iPage]==0 );.   
2e000 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c     pLeafPage = l
2e010 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65  eafCur.apPage[le
2e020 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20  afCur.iPage];.  
2e030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e040 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
2e050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2e060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e080 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72       int leafCur
2e090 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a  sorInvalid = 0;.
2e0a0 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
2e0b0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2e0c0 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2e0d0 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2e0e0 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2e0f0 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2e100 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2e110 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2e120 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67  ->pgno, pLeafPag
2e130 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
2e140 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2e150 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
2e160 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2e170 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
2e180 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61  findCell(pLeafPa
2e190 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a  ge, 0);.      sz
2e1a0 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
2e1b0 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e  tr(pLeafPage, pN
2e1c0 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
2e1d0 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
2e1e0 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
2e1f0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74  );.      allocat
2e200 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2e210 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20  .      tempCell 
2e220 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
2e230 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
2e240 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2e250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e260 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2e270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e290 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2e2a0 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65  (pPage, idx, pNe
2e2b0 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
2e2c0 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
2e2d0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a      }...      /*
2e2e0 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   The "if" statem
2e2f0 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20  ent in the next 
2e300 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72  code block is cr
2e310 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  itical.  The.   
2e320 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20     ** slightest 
2e330 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74  error in that st
2e340 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c  atement would al
2e350 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70  low SQLite to op
2e360 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63  erate.      ** c
2e370 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66  orrectly most of
2e380 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70 72   the time but pr
2e390 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65 20  oduce very rare 
2e3a0 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20  failures.  To.  
2e3b0 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61      ** guard aga
2e3c0 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20 66  inst this, the f
2e3d0 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
2e3e0 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74  help to verify t
2e3f0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hat.      ** the
2e400 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20   "if" statement 
2e410 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a  is well tested..
2e420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
2e430 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
2e440 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
2e450 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74  pPage->nFree<pBt
2e460 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2e470 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2e480 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
2e490 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
2e4a0 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
2e4b0 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
2e4c0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
2e4d0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
2e4e0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
2e4f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2e500 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
2e510 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
2e520 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
2e530 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2e540 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
2e550 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
2e560 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
2e570 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
2e580 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2e590 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20  /3+1 .          
2e5a0 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
2e5b0 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
2e5c0 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
2e5d0 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
2e5e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2e5f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2e600 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
2e610 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2e620 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20  *2/3.           
2e630 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2e640 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2e650 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2e660 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2e670 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50 61    testcase( (pPa
2e680 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2e690 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65  || (pPage->nFree
2e6a0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2e6b0 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20  ze*2/3)).       
2e6c0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
2e6d0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
2e6e0 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75  szNext == pBt->u
2e6f0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
2e700 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  ...      if( (pP
2e710 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2e720 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
2e730 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
2e740 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20  ize*2/3)) &&.   
2e750 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61 67         (pLeafPag
2e760 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2e770 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
2e780 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29  ize*2/3).      )
2e790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2e7a0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2e7b0 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  n if the interna
2e7c0 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69  l node is now ei
2e7d0 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67  ther overflowing
2e7e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75  .        ** or u
2e7f0 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65  nderfull and the
2e800 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20   leaf node will 
2e810 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74  be underfull aft
2e820 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c  er the just cell
2e830 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
2e840 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ied to the inter
2e850 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65  nal node is dele
2e860 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69  ted from it. Thi
2e870 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20  s is a special. 
2e880 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62         ** case b
2e890 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
2e8a0 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20  to balance() to 
2e8b0 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74 65  correct the inte
2e8c0 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20  rnal node.      
2e8d0 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20    ** may change 
2e8e0 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74 75  the tree structu
2e8f0 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  re and invalidat
2e900 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2e910 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2e920 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
2e930 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69  ] and leafCur.ai
2e940 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68  Idx[] arrays, wh
2e950 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ich will be.    
2e960 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2e970 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71  he balance() req
2e980 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74  uired to correct
2e990 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c   the underfull l
2e9a0 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  eaf.        ** n
2e9b0 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ode..        **.
2e9c0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66          ** The f
2e9d0 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74  ormula used in t
2e9e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62  he expression ab
2e9f0 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e  ove are based on
2ea00 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20   facets of.     
2ea10 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
2ea20 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61   file-format tha
2ea30 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
2ea40 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20  over time..     
2ea50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65     */.        te
2ea60 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2ea70 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
2ea80 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20  eSize*2/3+1 );. 
2ea90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2eaa0 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2eab0 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d  e+2+szNext==pBt-
2eac0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
2ead0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61  1 );.        lea
2eae0 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
2eaf0 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20   1;.      }     
2eb00 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72     ..      if( r
2eb10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2eb20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2eb30 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2eb40 6c 28 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70  l(pPage, idx), p
2eb50 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  gnoChild);.     
2eb60 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75     VVA_ONLY( pCu
2eb70 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2eb80 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20   = 0 );.        
2eb90 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
2eba0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  r, 0);.      }..
2ebb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ebc0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43  LITE_OK && leafC
2ebd0 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a  ursorInvalid ){.
2ebe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2ebf0 65 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20  eaf-node is now 
2ec00 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f  underfull and so
2ec10 20 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20   the tree needs 
2ec20 74 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a  to be .        *
2ec30 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f  * rebalanced. Ho
2ec40 77 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e  wever, the balan
2ec50 63 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ce() operation o
2ec60 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20  n the internal. 
2ec70 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61         ** node a
2ec80 62 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f  bove may have mo
2ec90 64 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63  dified the struc
2eca0 74 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72  ture of the B-Tr
2ecb0 65 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ee and.        *
2ecc0 2a 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * so the current
2ecd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61   contents of lea
2ece0 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  fCur.apPage[] an
2ecf0 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b  d leafCur.aiIdx[
2ed00 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  ].        ** may
2ed10 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
2ed20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2ed30 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74      ** It is not
2ed40 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70   possible to cop
2ed50 79 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66  y the ancestry f
2ed60 72 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65  rom pCur, as the
2ed70 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a   same.        **
2ed80 20 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20   balance() call 
2ed90 68 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20  has invalidated 
2eda0 74 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65  the pCur->apPage
2edb0 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20  [] and aiIdx[]. 
2edc0 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73         ** arrays
2edd0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
2ede0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c        ** The cal
2edf0 6c 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50  l to saveCursorP
2ee00 6f 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20  osition() below 
2ee10 69 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73  internally saves
2ee20 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2ee30 20 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75   key that leafCu
2ee40 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  r is currently p
2ee50 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72  ointing to. Curr
2ee60 65 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20  ently, there.   
2ee70 20 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20       ** are two 
2ee80 63 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b  copies of that k
2ee90 65 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d  ey in the tree -
2eea0 20 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65   one here on the
2eeb0 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a   leaf.        **
2eec0 20 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e   page and one on
2eed0 20 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e   some internal n
2eee0 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  ode in the tree.
2eef0 20 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20   The copy on.   
2ef00 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66       ** the leaf
2ef10 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2ef20 74 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20  the next key in 
2ef30 74 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72  tree-order after
2ef40 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2ef50 20 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74   copy on the int
2ef60 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20  ernal node. So, 
2ef70 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
2ef80 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20  te3BtreeNext(). 
2ef90 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20         ** calls 
2efa0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2efb0 69 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74  ition() to point
2efc0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2efd0 68 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20  he copy.        
2efe0 2a 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ** stored on the
2eff0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20   internal node, 
2f000 74 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f  then advances to
2f010 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c   the next entry,
2f020 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63  .        ** whic
2f030 68 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  h happens to be 
2f040 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
2f050 6b 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  key on the inter
2f060 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20  nal node..      
2f070 20 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a    ** Net effect:
2f080 20 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e   leafCur is poin
2f090 74 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65  ting back to the
2f0a0 20 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a   duplicate cell.
2f0b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2f0c0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f  needs to be remo
2f0d0 76 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61  ved, and the lea
2f0e0 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  fCur.apPage[] an
2f0f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  d.        ** lea
2f100 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72  fCur.aiIdx[] arr
2f110 61 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e  ays are correct.
2f120 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f130 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67      VVA_ONLY( Pg
2f140 6e 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c  no leafPgno = pL
2f150 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  eafPage->pgno );
2f160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61  .        rc = sa
2f170 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2f180 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20  (&leafCur);.    
2f190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f1b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f1c0 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2f1d0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2f1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f1f0 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66  pLeafPage = leaf
2f200 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43  Cur.apPage[leafC
2f210 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20  ur.iPage];.     
2f220 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66     assert( pLeaf
2f230 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66  Page->pgno==leaf
2f240 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20  Pgno );.        
2f250 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e  assert( leafCur.
2f260 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
2f270 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
2f280 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
2f290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f2a0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
2f2b0 70 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73 7a  pLeafPage, 0, sz
2f2c0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  Next);.        V
2f2d0 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75 72  VA_ONLY( leafCur
2f2e0 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  .pagesShuffled =
2f2f0 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63   0 );.        rc
2f300 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61 66   = balance(&leaf
2f310 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2f320 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72   assert( leafCur
2f330 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21 6c  sorInvalid || !l
2f340 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66  eafCur.pagesShuf
2f350 66 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  fled.           
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f370 20 20 20 20 20 20 20 20 7c 7c 20 21 70 43 75 72          || !pCur
2f380 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
2f390 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2f3b0 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73  eReleaseTempCurs
2f3c0 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  or(&leafCur);.  
2f3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45  }else{.    TRACE
2f3e0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2f3f0 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20  =%d delete from 
2f400 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2f410 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2f420 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  t, pPage->pgno))
2f430 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2f440 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53  Page, idx, cellS
2f450 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2f460 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell));.    rc = 
2f470 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
2f480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2f490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f4a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2f4b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2f4c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
2f4d0 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
2f4e0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
2f4f0 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
2f500 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
2f510 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2f520 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2f530 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
2f540 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
2f550 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
2f560 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
2f570 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
2f580 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
2f590 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
2f5a0 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
2f5b0 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
2f5c0 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
2f5d0 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
2f5e0 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
2f5f0 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
2f600 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
2f610 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
2f620 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
2f630 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
2f650 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
2f660 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
2f670 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
2f680 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2f690 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2f6a0 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
2f6b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f6c0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2f6d0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
2f6e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
2f6f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f700 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f710 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2f720 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2f730 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2f740 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2f750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2f760 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  st */.    rc = p
2f770 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2f780 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2f790 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2f7a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f7b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2f7c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
2f7d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2f7e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
2f7f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2f800 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
2f810 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
2f820 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
2f830 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2f840 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
2f850 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f860 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2f870 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
2f880 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
2f890 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2f8a0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
2f8b0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2f8c0 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
2f8d0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
2f8e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
2f8f0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
2f900 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
2f910 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
2f920 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
2f930 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
2f940 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
2f950 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
2f960 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
2f970 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
2f980 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
2f990 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
2f9a0 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
2f9b0 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
2f9c0 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
2f9d0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
2f9e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
2f9f0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
2fa00 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
2fa10 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
2fa20 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
2fa30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2fa40 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2fa50 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
2fa60 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2fa70 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
2fa80 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
2fa90 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2faa0 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
2fab0 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
2fac0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2fad0 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
2fae0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2faf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2fb00 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f  Meta(p, 4, &pgno
2fb10 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2fb20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fb30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fb40 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52  .    }.    pgnoR
2fb50 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
2fb60 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2fb70 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
2fb80 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
2fb90 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
2fba0 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
2fbb0 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
2fbc0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
2fbd0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
2fbe0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
2fbf0 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
2fc00 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
2fc10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2fc20 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
2fc30 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
2fc40 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
2fc50 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
2fc60 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
2fc70 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
2fc80 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
2fc90 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
2fca0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
2fcb0 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
2fcc0 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
2fcd0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2fce0 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
2fcf0 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
2fd00 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
2fd10 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
2fd20 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2fd30 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70  , &pPageMove, &p
2fd40 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f  gnoMove, pgnoRoo
2fd50 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
2fd60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fd70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fd80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2fd90 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f  pgnoMove!=pgnoRo
2fda0 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  ot ){.      /* p
2fdb0 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70  gnoRoot is the p
2fdc0 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
2fdd0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
2fde0 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20  ot-page of.     
2fdf0 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c   ** the new tabl
2fe00 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65  e (assuming an e
2fe10 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63  rror did not occ
2fe20 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65  ur). But we were
2fe30 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  .      ** alloca
2fe40 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66  ted pgnoMove. If
2fe50 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20   required (i.e. 
2fe60 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
2fe70 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  located.      **
2fe80 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68   by extending th
2fe90 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72  e file), the cur
2fea0 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73  rent page at pos
2feb0 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20  ition pgnoMove. 
2fec0 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
2fed0 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20  dy journaled..  
2fee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20      */.      u8 
2fef0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
2ff00 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
2ff10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ff20 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20  PageMove);..    
2ff30 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61    /* Move the pa
2ff40 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20  ge currently at 
2ff50 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f  pgnoRoot to pgno
2ff60 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  Move. */.      r
2ff70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2ff80 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
2ff90 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2ffa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ffb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ffc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ffd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2ffe0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2fff0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54  t, pgnoRoot, &eT
30000 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
30010 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30020 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70  QLITE_OK || eTyp
30030 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
30040 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  GE || eType==PTR
30050 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
30060 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30070 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
30080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
300a0 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
300b0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
300c0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
300d0 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe!=PTRMAP_FREEP
300e0 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  AGE );.      rc 
300f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30100 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
30110 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30130 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30140 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
30150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
30170 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
30180 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65  Bt, pRoot, eType
30190 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f  , iPtrPage, pgno
301a0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
301b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
301c0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
301d0 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
301e0 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
301f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30220 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
30230 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
30240 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
30250 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
30260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30290 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
302a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
302b0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
302c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
302d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
302e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
302f0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
30300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30310 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
30320 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
30330 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
30340 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
30350 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
30360 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
30370 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
30380 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
30390 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
303a0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
303b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
303c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
303d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
303e0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
303f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30400 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
30410 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
30420 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
30430 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
30440 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
30450 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
30460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30470 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
30480 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
30490 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
304a0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
304b0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
304c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
304d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
304e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
304f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
30500 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
30510 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
30520 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
30530 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  F);.  sqlite3Pag
30540 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70  erUnref(pRoot->p
30550 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61  DbPage);.  *piTa
30560 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
30570 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
30580 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
30590 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
305a0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
305b0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
305c0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
305d0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
305e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
305f0 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
30600 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
30610 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
30620 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
30630 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
30640 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
30650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
30660 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
30670 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
30680 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
30690 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
306a0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
306b0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
306c0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
306d0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
306e0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
306f0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
30700 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
30710 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
30720 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
30730 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
30740 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
30750 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
30760 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
30770 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
30780 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
30790 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
307a0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
307b0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
307c0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
307d0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
307e0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
307f0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
30800 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
30810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
30820 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
30830 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
30840 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
30850 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
30860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
30870 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
30880 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
30890 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
308a0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
308b0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
308c0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
308d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
308e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
308f0 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
30900 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
30910 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
30920 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
30930 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
30940 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
30950 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
30960 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  age, 1);.      i
30970 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
30980 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
30990 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
309a0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
309b0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
309c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
309d0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
309e0 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
309f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30a00 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
30a10 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
30a20 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
30a30 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65  aData[8]), pPage
30a40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
30a50 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
30a60 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
30a70 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
30a80 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
30a90 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
30aa0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
30ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30ac0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
30ad0 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
30ae0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
30af0 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
30b00 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
30b10 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
30b20 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
30b30 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30b40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30b50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
30b60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
30b70 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
30b80 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
30b90 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
30ba0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30bb0 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
30bc0 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
30bd0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
30be0 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
30bf0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
30c00 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
30c10 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
30c20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
30c30 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
30c40 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
30c50 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
30c60 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
30c70 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
30c80 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
30c90 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
30ca0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
30cb0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
30cc0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
30cd0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
30ce0 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72  iTable){.  int r
30cf0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
30d00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
30d10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
30d20 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
30d30 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
30d40 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
30d50 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
30d60 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
30d70 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
30d80 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
30d90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
30da0 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
30db0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ks(p, iTable, 0,
30dc0 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   1))!=SQLITE_OK 
30dd0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
30de0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
30df0 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  se if( SQLITE_OK
30e00 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
30e10 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62  ursors(pBt, iTab
30e20 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f  le, 0)) ){.    /
30e30 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
30e40 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
30e50 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
30e60 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  sePage(pBt, (Pgn
30e70 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b  o)iTable, 0, 0);
30e80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
30e90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
30ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30eb0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
30ec0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
30ed0 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
30ee0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
30ef0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
30f00 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
30f10 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
30f20 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
30f30 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
30f40 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
30f50 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
30f60 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
30f70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
30f80 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
30f90 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
30fa0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
30fb0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
30fc0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
30fd0 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
30fe0 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
30ff0 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
31000 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
31010 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
31020 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
31030 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
31040 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
31050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
31060 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
31070 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
31080 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
31090 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
310a0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
310b0 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
310c0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
310d0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
310e0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
310f0 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
31100 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
31110 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
31120 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
31130 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
31140 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
31150 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
31160 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
31170 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
31180 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
31190 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
311a0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
311b0 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
311c0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
311d0 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
311e0 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
311f0 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
31200 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
31210 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
31220 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
31230 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
31240 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
31250 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
31260 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
31270 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
31280 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31290 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
312a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
312b0 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
312c0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
312d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
312e0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
312f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
31300 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31310 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
31320 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  (p) );.  if( p->
31330 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
31340 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
31350 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
31360 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
31370 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
31380 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  R;.  }..  /* It 
31390 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72  is illegal to dr
313a0 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  op a table if an
313b0 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
313c0 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
313d0 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
313e0 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
313f0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
31400 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
31410 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
31420 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65  nother root-page
31430 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c   to fill a gap l
31440 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
31450 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  ed.  ** root pag
31460 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  e. If an open cu
31470 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
31480 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c  his page a probl
31490 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f  em would .  ** o
314a0 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
314b0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
314c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
314d0 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
314e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
314f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31500 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
31510 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
31520 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31540 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
31550 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   iTable);.  if( 
31560 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
31570 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31590 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
315a0 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
315b0 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
315c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
315d0 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
315e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
315f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
31600 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
31610 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31620 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
31630 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
31640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31650 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
31660 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
31670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31690 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
316a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
316b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
316c0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
316d0 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
316e0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
316f0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
31700 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
31710 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
31720 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
31730 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
31740 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
31750 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
31760 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
31770 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
31780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
31790 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
317a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
317b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
317c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
317d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
317e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
317f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
31800 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31810 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
31820 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
31830 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
31840 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
31850 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
31860 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
31870 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
31880 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
31890 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
318a0 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
318b0 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
318c0 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
318d0 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
318e0 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
318f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31900 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
31910 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
31920 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
31930 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
31940 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
31950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31960 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
31970 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
31980 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
31990 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
319a0 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f  pMove, PTRMAP_RO
319b0 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c  OTPAGE, 0, iTabl
319c0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  e, 0);.        r
319d0 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
319e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
319f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31a10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
31a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31a30 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
31a40 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
31a50 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
31a60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31aa0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
31ab0 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
31ac0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
31ad0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
31ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31af0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31b00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
31b10 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
31b20 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
31b30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
31b40 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
31b50 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
31b60 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
31b70 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
31b80 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
31b90 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
31ba0 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
31bb0 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
31bc0 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
31bd0 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
31be0 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
31bf0 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
31c00 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
31c10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
31c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
31c30 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
31c40 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
31c50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
31c60 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
31c70 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
31c80 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
31c90 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
31ca0 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
31cb0 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
31cc0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
31cd0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
31ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
31cf0 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
31d00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
31d10 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
31d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
31d30 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
31d40 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
31d50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31d60 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
31d70 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
31d80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31d90 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
31da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
31db0 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
31dc0 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
31dd0 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
31de0 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
31df0 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
31e00 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
31e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31e20 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
31e30 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
31e40 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
31e50 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
31e60 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
31e70 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
31e80 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
31e90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
31ea0 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
31eb0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
31ec0 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
31ed0 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
31ee0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
31ef0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
31f00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
31f10 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
31f20 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
31f30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
31f40 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
31f50 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
31f60 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
31f70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
31f80 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
31f90 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
31fa0 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
31fb0 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
31fc0 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
31fd0 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
31fe0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
31ff0 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
32000 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
32010 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
32020 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
32030 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
32040 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
32050 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
32060 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
32070 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
32080 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
32090 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
320a0 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
320b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
320c0 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
320d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
320e0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
320f0 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
32100 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
32110 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  bPage;.  int rc;
32120 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32130 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
32140 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
32150 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
32160 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
32170 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  >db = p->db;..  
32180 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
32190 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
321a0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
321b0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
321c0 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
321d0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
321e0 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
321f0 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
32200 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
32210 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
32220 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
32230 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
32240 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
32250 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
32260 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
32270 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
32280 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
32290 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
322a0 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
322b0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
322c0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
322d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
322e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
322f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
32300 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
32310 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
32320 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
32330 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  5 );.  if( pBt->
32340 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a  pPage1 ){.    /*
32350 20 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61   The b-tree is a
32360 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61  lready holding a
32370 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32380 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
32390 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
323a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
323b0 68 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61  he required meta
323c0 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20  -data value can 
323d0 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
323e0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
323f0 20 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68   page data of th
32400 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  is reference. Th
32410 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  is is slightly f
32420 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  aster than.    *
32430 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e  * requesting a n
32440 65 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f  ew reference fro
32450 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
32460 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  r..    */.    pP
32470 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
32480 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  ar *)pBt->pPage1
32490 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65  ->aData;.  }else
324a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
324b0 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ree does not hav
324c0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
324d0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
324e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
324f0 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20    ** Obtain one 
32500 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
32510 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ayer..    */.   
32520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32530 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
32540 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b  r, 1, &pDbPage);
32550 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32560 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
32570 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
32580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32590 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  }.    pP1 = (uns
325a0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
325b0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
325c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
325d0 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79   *pMeta = get4by
325e0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
325f0 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  *4]);..  /* If t
32600 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74  he b-tree is not
32610 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
32620 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20  ence to page 1, 
32630 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20  then one was .  
32640 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32650 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
32660 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62  r in the above b
32670 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74  lock. Release it
32680 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
32690 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b   !pBt->pPage1 ){
326a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
326b0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
326c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75  .  }..  /* If au
326d0 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
326e0 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
326f0 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
32700 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
32710 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
32720 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
32730 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
32740 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
32750 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
32760 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32770 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
32780 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
32790 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
327a0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
327b0 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c   Grab the read-l
327c0 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  ock on page 1. *
327d0 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62  /.  rc = lockTab
327e0 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  le(p, 1, READ_LO
327f0 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
32800 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
32810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32820 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
32830 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
32840 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
32850 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
32860 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
32870 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
32880 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
32890 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
328a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
328b0 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
328c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
328d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
328e0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
328f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
32900 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
32910 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74  x<=15 );.  sqlit
32920 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
32930 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
32940 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  db;.  if( p->inT
32950 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
32960 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  E ){.    rc = pB
32970 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
32980 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
32990 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
329a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
329b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  t( pBt->pPage1!=
329c0 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70  0 );.    pP1 = p
329d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
329e0 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  a;.    rc = sqli
329f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
32a00 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
32a10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
32a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32a30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32a40 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69  1[36 + idx*4], i
32a50 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  Meta);.#ifndef S
32a60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32a70 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
32a80 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  idx==7 ){.      
32a90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
32aa0 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65  utoVacuum || iMe
32ab0 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ta==0 );.       
32ac0 20 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d   assert( iMeta==
32ad0 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b  0 || iMeta==1 );
32ae0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
32af0 63 72 56 61 63 75 75 6d 20 3d 20 69 4d 65 74 61  crVacuum = iMeta
32b00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
32b20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
32b30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
32b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32b50 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
32b60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
32b70 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
32b80 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
32b90 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
32ba0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
32bb0 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
32bc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
32bd0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
32be0 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
32bf0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
32c00 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
32c10 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
32c20 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
32c30 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  on() here..  */.
32c40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32c50 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ;.  restoreCurso
32c60 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
32c70 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
32c80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
32c90 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
32ca0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
32cb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
32cc0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d  rt( pPage->pBt==
32cd0 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72  pCur->pBt );.  r
32ce0 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
32cf0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
32d00 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
32d10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
32d20 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73  rn the pager ass
32d30 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42  ociated with a B
32d40 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Tree.  This rout
32d50 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ine is used for.
32d60 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
32d70 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
32d80 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  /.Pager *sqlite3
32d90 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65  BtreePager(Btree
32da0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
32db0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d  ->pBt->pPager;.}
32dc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
32dd0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
32de0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65  CHECK./*.** Appe
32df0 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20  nd a message to 
32e00 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
32e10 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
32e20 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70  tic void checkAp
32e30 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67  pendMsg(.  Integ
32e40 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a  rityCk *pCheck,.
32e50 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20    char *zMsg1,. 
32e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
32e70 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  rmat,.  ....){. 
32e80 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
32e90 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72  f( !pCheck->mxEr
32ea0 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  r ) return;.  pC
32eb0 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20  heck->mxErr--;. 
32ec0 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b   pCheck->nErr++;
32ed0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
32ee0 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20  zFormat);.  if( 
32ef0 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e  pCheck->errMsg.n
32f00 43 68 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Char ){.    sqli
32f10 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
32f20 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  d(&pCheck->errMs
32f30 67 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d  g, "\n", 1);.  }
32f40 0a 20 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a  .  if( zMsg1 ){.
32f50 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
32f60 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63  cumAppend(&pChec
32f70 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31  k->errMsg, zMsg1
32f80 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , -1);.  }.  sql
32f90 69 74 65 33 56 58 50 72 69 6e 74 66 28 26 70 43  ite3VXPrintf(&pC
32fa0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c  heck->errMsg, 1,
32fb0 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
32fc0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
32fd0 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  f( pCheck->errMs
32fe0 67 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  g.mallocFailed )
32ff0 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61  {.    pCheck->ma
33000 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
33010 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
33020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
33030 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
33040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33050 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
33060 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20  ECK./*.** Add 1 
33070 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
33080 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
33090 69 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20  iPage.  If this 
330a0 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  is the second.**
330b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
330c0 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65  e page, add an e
330d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
330e0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e  pCheck->zErrMsg.
330f0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
33100 74 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20  there are 2 ore 
33110 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  more references 
33120 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
33130 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20  0 if.** if this 
33140 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66  is the first ref
33150 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
33160 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63  ge..**.** Also c
33170 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
33180 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20  ge number is in 
33190 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  bounds..*/.stati
331a0 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49  c int checkRef(I
331b0 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
331c0 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63  ck, int iPage, c
331d0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
331e0 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
331f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
33200 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
33210 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20  Page || iPage<0 
33220 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
33230 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33240 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64  ontext, "invalid
33250 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22   page number %d"
33260 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
33270 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
33280 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b  ( pCheck->anRef[
33290 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20  iPage]==1 ){.   
332a0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
332b0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
332c0 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65  , "2nd reference
332d0 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50   to page %d", iP
332e0 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
332f0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
33300 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66    (pCheck->anRef
33310 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a  [iPage]++)>1;.}.
33320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33330 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33340 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
33350 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
33360 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
33370 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61  r page iChild ma
33380 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69  ps to .** page i
33390 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20  Parent, pointer 
333a0 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66  type ptrType. If
333b0 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20   not, append an 
333c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
333d0 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   to pCheck..*/.s
333e0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
333f0 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72  Ptrmap(.  Integr
33400 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
33410 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
33420 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  eck context */. 
33430 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
33440 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
33450 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
33460 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
33470 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
33480 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
33490 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   type */.  Pgno 
334a0 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  iParent,        
334b0 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
334c0 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74  inter map parent
334d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
334e0 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
334f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
33500 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
33510 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20  (used for error 
33520 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  msg) */.){.  int
33530 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61   rc;.  u8 ePtrma
33540 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pType;.  Pgno iP
33550 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20  trmapParent;..  
33560 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
33570 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69  Check->pBt, iChi
33580 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65  ld, &ePtrmapType
33590 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74  , &iPtrmapParent
335a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
335b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
335c0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
335d0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
335e0 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70  Failed to read p
335f0 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69  trmap key=%d", i
33600 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
33610 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  rn;.  }..  if( e
33620 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70  PtrmapType!=eTyp
33630 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65  e || iPtrmapPare
33640 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20  nt!=iParent ){. 
33650 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33660 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
33670 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20  xt, .      "Bad 
33680 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65  ptr map entry ke
33690 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25  y=%d expected=(%
336a0 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64  d,%d) got=(%d,%d
336b0 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c  )", .      iChil
336c0 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e  d, eType, iParen
336d0 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20  t, ePtrmapType, 
336e0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
336f0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
33700 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e  .** Check the in
33710 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
33720 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e  reelist or of an
33730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
33740 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74  ist..** Verify t
33750 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
33760 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c  f pages on the l
33770 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61  ist is N..*/.sta
33780 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69  tic void checkLi
33790 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  st(.  IntegrityC
337a0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49  k *pCheck,  /* I
337b0 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
337c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
337d0 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20  nt isFreeList,  
337e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
337f0 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61   a freelist.  Fa
33800 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  lse for overflow
33810 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
33820 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
33830 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33840 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70  mber for first p
33850 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
33860 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
33870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
33880 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
33890 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
338a0 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  st */.  char *zC
338b0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a  ontext        /*
338c0 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   Context for err
338d0 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29  or messages */.)
338e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
338f0 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20   expected = N;. 
33900 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50   int iFirst = iP
33910 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  age;.  while( N-
33920 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d  - > 0 && pCheck-
33930 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62  >mxErr ){.    Db
33940 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b  Page *pOvflPage;
33950 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
33960 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20  ar *pOvflData;. 
33970 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29     if( iPage<1 )
33980 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
33990 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
339a0 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
339b0 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65    "%d of %d page
339c0 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f  s missing from o
339d0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61  verflow list sta
339e0 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20  rting at %d",.  
339f0 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70          N+1, exp
33a00 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a  ected, iFirst);.
33a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33a20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
33a30 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
33a40 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62  e, zContext) ) b
33a50 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
33a60 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43  lite3PagerGet(pC
33a70 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50  heck->pPager, (P
33a80 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66  gno)iPage, &pOvf
33a90 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  lPage) ){.      
33aa0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
33ab0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
33ac0 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
33ad0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
33ae0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
33af0 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61     }.    pOvflDa
33b00 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
33b10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
33b20 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50  erGetData(pOvflP
33b30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  age);.    if( is
33b40 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
33b50 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
33b60 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d  te(&pOvflData[4]
33b70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33b80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33b90 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  M.      if( pChe
33ba0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
33bb0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
33bc0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
33bd0 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  k, iPage, PTRMAP
33be0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
33bf0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
33c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
33c10 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d  ( n>pCheck->pBt-
33c20 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20  >usableSize/4-2 
33c30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33c40 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33c50 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
33c60 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74         "freelist
33c70 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20   leaf count too 
33c80 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  big on page %d",
33c90 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
33ca0 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   N--;.      }els
33cb0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
33cc0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
33cd0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
33ce0 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79  reePage = get4by
33cf0 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b  te(&pOvflData[8+
33d00 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  i*4]);.#ifndef S
33d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33d20 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20  ACUUM.          
33d30 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
33d40 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33d50 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33d60 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
33d70 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50  FreePage, PTRMAP
33d80 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
33d90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
33da0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33db0 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70        checkRef(p
33dc0 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
33dd0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
33de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e       }.        N
33df0 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   -= n;.      }. 
33e00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
33e10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33e20 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  UUM.    else{.  
33e30 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64      /* If this d
33e40 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
33e50 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64   auto-vacuum and
33e60 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68   iPage is not th
33e70 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
33e80 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65  page in this ove
33e90 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63  rflow list, chec
33ea0 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74  k that the point
33eb0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
33ec0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  .      ** the fo
33ed0 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74  llowing page mat
33ee0 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20  ches iPage..    
33ef0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
33f00 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
33f10 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b  Vacuum && N>0 ){
33f20 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74  .        i = get
33f30 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
33f40 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
33f50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
33f60 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
33f70 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
33f80 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
33f90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
33fa0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
33fb0 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73  OvflData);.    s
33fc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
33fd0 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d  (pOvflPage);.  }
33fe0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
33ff0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
34000 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
34010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34020 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
34030 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75  ./*.** Do variou
34040 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20  s sanity checks 
34050 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
34060 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74   of a tree.  Ret
34070 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  urn.** the tree 
34080 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67  depth.  Root pag
34090 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61  es return 0.  Pa
340a0 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61  rents of root pa
340b0 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c  ges.** return 1,
340c0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   and so forth..*
340d0 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63  * .** These chec
340e0 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a  ks are done:.**.
340f0 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65  **      1.  Make
34100 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73   sure that cells
34110 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20   and freeblocks 
34120 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a  do not overlap.*
34130 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63  *          but c
34140 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65  ombine to comple
34150 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70  tely cover the p
34160 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20  age..**  NO  2. 
34170 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20   Make sure cell 
34180 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65  keys are in orde
34190 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d  r..**  NO  3.  M
341a0 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
341b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
341c0 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42  equal to zLowerB
341d0 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e  ound..**  NO  4.
341e0 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
341f0 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ey is greater th
34200 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
34210 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  UpperBound..**  
34220 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68      5.  Check th
34230 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f  e integrity of o
34240 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
34250 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72  *      6.  Recur
34260 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63  sively call chec
34270 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c  kTreePage on all
34280 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20   children..**   
34290 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68     7.  Verify th
342a0 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  at the depth of 
342b0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20  all children is 
342c0 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20  the same..**    
342d0 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    8.  Make sure 
342e0 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20  this page is at 
342f0 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f  least 33% full o
34300 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20  r else it is.** 
34310 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f           the roo
34320 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a  t of the tree..*
34330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
34340 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e  ckTreePage(.  In
34350 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
34360 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66  k,  /* Context f
34370 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
34380 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  eck */.  int iPa
34390 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
343a0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
343b0 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65   the page to che
343c0 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ck */.  MemPage 
343d0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
343e0 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   Parent page */.
343f0 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43    char *zParentC
34400 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e  ontext  /* Paren
34410 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  t context */.){.
34420 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34430 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
34440 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
34450 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
34460 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
34470 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
34480 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
34490 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  pBt;.  int usabl
344a0 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43  eSize;.  char zC
344b0 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63  ontext[100];.  c
344c0 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c  har *hit;..  sql
344d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
344e0 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
344f0 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
34500 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
34510 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
34520 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
34530 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
34540 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
34550 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
34560 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
34570 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
34580 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
34590 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
345a0 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
345b0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
345c0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
345d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
345e0 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
345f0 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
34600 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
34610 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
34620 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
34630 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
34640 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
34650 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
34660 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
34670 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
34680 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
34690 70 50 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20  pPage))!=0 ){.  
346a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
346b0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
346c0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
346d0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42         "sqlite3B
346e0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72  treeInitPage() r
346f0 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
34700 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
34710 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34720 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
34730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
34740 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
34750 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
34760 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
34770 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
34780 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
34790 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  r; i++){.    u8 
347a0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
347b0 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
347c0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
347d0 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
347e0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
347f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
34800 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
34810 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
34820 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
34830 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25   "On tree page %
34840 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50  d cell %d: ", iP
34850 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65  age, i);.    pCe
34860 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
34870 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69  age,i);.    sqli
34880 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
34890 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
348a0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
348b0 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
348c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
348d0 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
348e0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73  nfo.nKey;.    as
348f0 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e  sert( sz==info.n
34900 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69  Payload );.    i
34910 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
34920 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
34930 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
34940 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
34950 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
34960 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
34970 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
34980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
34990 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
349a0 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
349b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
349c0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
349d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
349e0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
349f0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
34a00 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
34a10 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
34a20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
34a30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34a40 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
34a50 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
34a60 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
34a70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
34a80 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
34a90 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
34aa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
34ab0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
34ac0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
34ad0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
34ae0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34af0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34b00 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34b10 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
34b20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
34b30 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
34b40 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
34b50 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
34b60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34b70 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
34b80 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
34b90 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a  Page,zContext);.
34ba0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
34bb0 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20   d2!=depth ){.  
34bc0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
34bd0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
34be0 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
34bf0 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
34c00 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
34c10 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20    depth = d2;.  
34c20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
34c30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
34c40 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
34c50 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
34c60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
34c70 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  +8]);.    sqlite
34c80 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34c90 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
34ca0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
34cc0 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
34cd0 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
34ce0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
34cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34d00 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
34d10 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
34d20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
34d30 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
34d40 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
34d50 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
34d60 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
34d70 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
34d80 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
34d90 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
34da0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
34db0 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
34dc0 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
34dd0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
34de0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
34df0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
34e00 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61   hit = sqlite3Pa
34e10 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
34e20 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  ageSize );.  if(
34e30 20 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70   hit==0 ){.    p
34e40 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Check->mallocFai
34e50 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  led = 1;.  }else
34e60 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
34e70 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  , 0, usableSize 
34e80 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  );.    memset(hi
34e90 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26  t, 1, get2byte(&
34ea0 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20  data[hdr+5]));. 
34eb0 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62     nCell = get2b
34ec0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
34ed0 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74  );.    cellStart
34ee0 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
34ef0 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
34f00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34f10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
34f20 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
34f30 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74  (&data[cellStart
34f40 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31  +i*2]);.      u1
34f50 36 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  6 size = 1024;. 
34f60 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
34f70 20 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c 65    if( pc<=usable
34f80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
34f90 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
34fa0 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
34fb0 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pc]);.      }.  
34fc0 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65      if( (pc+size
34fd0 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
34fe0 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20  || pc<0 ){.     
34ff0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
35000 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
35010 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
35020 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
35030 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
35040 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
35050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35060 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b         for(j=pc+
35070 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a  size-1; j>=pc; j
35080 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
35090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
350a0 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74  for(cnt=0, i=get
350b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
350c0 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73  1]); i>0 && i<us
350d0 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c  ableSize && cnt<
350e0 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20  10000; .        
350f0 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20     cnt++){.     
35100 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
35110 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29  byte(&data[i+2])
35120 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
35130 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65       if( (i+size
35140 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
35150 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  || i<0 ){.      
35160 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35170 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20  (pCheck, 0,  .  
35180 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
35190 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
351a0 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
351b0 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
351c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
351d0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73         for(j=i+s
351e0 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ize-1; j>=i; j--
351f0 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
35200 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65    }.      i = ge
35210 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29  t2byte(&data[i])
35220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
35230 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c  i=cnt=0; i<usabl
35240 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
35250 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30     if( hit[i]==0
35260 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b   ){.        cnt+
35270 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
35280 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20  f( hit[i]>1 ){. 
35290 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
352a0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
352b0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74  .          "Mult
352c0 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79  iple uses for by
352d0 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  te %d of page %d
352e0 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20  ", i, iPage);.  
352f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
35310 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72  f( cnt!=data[hdr
35320 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  +7] ){.      che
35330 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
35340 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
35350 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70    "Fragmented sp
35360 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72  ace is %d byte r
35370 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e  eported as %d on
35380 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
35390 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68       cnt, data[h
353a0 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20  dr+7], iPage);. 
353b0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
353c0 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29 3b  e3PageFree(hit);
353d0 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
353e0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
353f0 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64   depth+1;.}.#end
35400 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35410 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
35420 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
35430 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
35440 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
35450 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
35460 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65  s a complete che
35470 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ck of the given 
35480 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f  BTree file.  aRo
35490 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72  ot[] is.** an ar
354a0 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  ray of pages num
354b0 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70  bers were each p
354c0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68  age number is th
354d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
354e0 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f  * a table.  nRoo
354f0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
35500 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
35510 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  oot..**.** Write
35520 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
35530 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e  rror seen in *pn
35540 45 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72  Err.  Except for
35550 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20   some memory.** 
35560 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
35570 73 2c 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65 73  s,  nn error mes
35580 73 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e 20  sage is held in 
35590 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
355a0 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69  from.** malloc i
355b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70  s returned if *p
355c0 6e 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nErr is non-zero
355d0 2e 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20  .  If *pnErr==0 
355e0 74 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  then NULL is.** 
355f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
35600 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49  r *sqlite3BtreeI
35610 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20  ntegrityCheck(. 
35620 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f   Btree *p,     /
35630 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62  * The btree to b
35640 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
35650 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20  nt *aRoot,   /* 
35660 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74  An array of root
35670 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66   pages numbers f
35680 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72  or individual tr
35690 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ees */.  int nRo
356a0 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ot,    /* Number
356b0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
356c0 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Root[] */.  int 
356d0 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f  mxErr,    /* Sto
356e0 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f  p reporting erro
356f0 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61  rs after this ma
35700 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ny */.  int *pnE
35710 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e  rr    /* Write n
35720 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
35730 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72  seen to this var
35740 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  iable */.){.  in
35750 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b  t i;.  int nRef;
35760 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73  .  IntegrityCk s
35770 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65  Check;.  BtShare
35780 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35790 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30  .  char zErr[100
357a0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ];..  sqlite3Btr
357b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
357c0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
357d0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
357e0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
357f0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
35800 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
35810 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f  try(p)!=SQLITE_O
35820 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20  K ){.    *pnErr 
35830 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
35840 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
35850 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
35860 33 44 62 53 74 72 44 75 70 28 30 2c 20 22 63 61  3DbStrDup(0, "ca
35870 6e 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20 72  nnot acquire a r
35880 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
35890 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
358a0 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
358b0 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
358c0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
358d0 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
358e0 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
358f0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
35900 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
35910 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
35920 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
35930 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69  sCheck.mallocFai
35940 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72  led = 0;.  *pnEr
35950 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  r = 0;.#ifndef S
35960 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35970 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
35980 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20  >nTrunc!=0 ){.  
35990 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
359a0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
359b0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
359c0 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
359d0 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
359e0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
359f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
35a00 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
35a10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
35a20 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
35a30 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68  ite3Malloc( (sCh
35a40 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
35a50 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
35a60 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73  [0]) );.  if( !s
35a70 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20  Check.anRef ){. 
35a80 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
35a90 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
35aa0 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
35ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35ac0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
35ad0 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
35ae0 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
35af0 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
35b00 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
35b10 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
35b20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
35b30 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
35b40 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
35b50 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
35b60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
35b70 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68  trAccumInit(&sCh
35b80 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72  eck.errMsg, zErr
35b90 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20  , sizeof(zErr), 
35ba0 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68  20000);..  /* Ch
35bb0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
35bc0 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
35bd0 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69  t.  */.  checkLi
35be0 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67  st(&sCheck, 1, g
35bf0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
35c00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
35c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,.            ge
35c20 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
35c30 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c  ge1->aData[36]),
35c40 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a   "Main freelist:
35c50 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b   ");..  /* Check
35c60 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e   all the tables.
35c70 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
35c80 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65   i<nRoot && sChe
35c90 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
35ca0 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d      if( aRoot[i]
35cb0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
35cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35cd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35ce0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35cf0 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b  Vacuum && aRoot[
35d00 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68  i]>1 ){.      ch
35d10 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63  eckPtrmap(&sChec
35d20 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52  k, aRoot[i], PTR
35d30 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
35d40 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
35d50 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
35d60 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
35d70 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20  ot[i], 0, "List 
35d80 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22  of tree roots: "
35d90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
35da0 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67  e sure every pag
35db0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  e in the file is
35dc0 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f   referenced.  */
35dd0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73  .  for(i=1; i<=s
35de0 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73  Check.nPage && s
35df0 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
35e00 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
35e10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
35e20 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
35e30 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20  anRef[i]==0 ){. 
35e40 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
35e50 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
35e60 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
35e70 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
35e80 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
35e90 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
35ea0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
35eb0 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20  cuum, make sure 
35ec0 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  no tables contai
35ed0 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  n.    ** referen
35ee0 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d  ces to pointer-m
35ef0 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f  ap pages..    */
35f00 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
35f10 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a  anRef[i]==0 && .
35f20 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
35f30 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69  AGENO(pBt, i)!=i
35f40 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61   || !pBt->autoVa
35f50 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
35f60 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
35f70 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
35f80 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
35f90 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", i);.    }.   
35fa0 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
35fb0 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20  f[i]!=0 && .    
35fc0 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
35fd0 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20  O(pBt, i)==i && 
35fe0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
35ff0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
36000 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
36010 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61  , 0, "Pointer ma
36020 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66  p page %d is ref
36030 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20  erenced", i);.  
36040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
36050 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
36060 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64  his analysis did
36070 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75   not leave any u
36080 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a  nref() pages.  *
36090 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  /.  unlockBtreeI
360a0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
360b0 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69  if( nRef != sqli
360c0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
360d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
360e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
360f0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
36100 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
36110 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
36120 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
36130 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
36140 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
36150 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65  Ref, sqlite3Page
36160 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
36170 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
36180 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
36190 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
361a0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
361b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
361c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
361d0 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a  (sCheck.anRef);.
361e0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c    if( sCheck.mal
361f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
36200 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
36210 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72  Reset(&sCheck.er
36220 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72  rMsg);.    *pnEr
36230 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b  r = sCheck.nErr+
36240 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
36250 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20  .  }.  *pnErr = 
36260 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69  sCheck.nErr;.  i
36270 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d  f( sCheck.nErr==
36280 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  0 ) sqlite3StrAc
36290 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b  cumReset(&sCheck
362a0 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75  .errMsg);.  retu
362b0 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
362c0 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b  umFinish(&sCheck
362d0 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64  .errMsg);.}.#end
362e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
362f0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
36300 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
36310 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
36320 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
36330 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
36340 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
36350 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69  pager filename i
36360 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
36370 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
36380 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
36390 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
363a0 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
363b0 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
363c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
363d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
363e0 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  lename(Btree *p)
363f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
36400 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
36410 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36420 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
36430 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
36440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36450 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
36460 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
36470 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
36480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
36490 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64  *.** The pager d
364a0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73  irectory name is
364b0 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
364c0 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
364d0 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
364e0 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
364f0 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
36500 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
36510 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
36520 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
36530 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
36540 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
36550 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
36560 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
36570 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70  agerDirname(p->p
36580 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
36590 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
365a0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
365b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
365c0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
365d0 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
365e0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75  alue of this rou
365f0 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65  tine is the same
36600 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
36610 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  hether the journ
36620 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  al file.** has b
36630 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e  een created or n
36640 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ot..**.** The pa
36650 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ger journal file
36660 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
36670 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
36680 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
36690 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
366a0 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
366b0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
366c0 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
366d0 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
366e0 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
366f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36700 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
36710 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
36720 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  rn sqlite3PagerJ
36730 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42  ournalname(p->pB
36740 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23  t->pPager);.}..#
36750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36760 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
36770 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
36780 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74  e content of pBt
36790 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e  From into pBtTo.
367a0 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a    A transaction.
367b0 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  ** must be activ
367c0 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73  e for both files
367d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ..**.** The size
367e0 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79   of file pTo may
367f0 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
36800 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
36810 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
36820 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
36830 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
36840 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
36850 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
36860 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61  ssful, CommitPha
36870 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63  seOne() may be c
36880 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66  alled on pTo bef
36890 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a  ore returning. .
368a0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
368b0 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d  ould finish comm
368c0 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  itting the trans
368d0 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79  action on pTo by
368e0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
368f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
36900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36910 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  btreeCopyFile(Bt
36920 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
36930 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
36940 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36950 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f   Pgno i;..  Pgno
36960 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20   nFromPage;     
36970 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
36980 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20  es in pFrom */. 
36990 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20   Pgno nToPage;  
369a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
369b0 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a  f pages in pTo *
369c0 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67  /.  Pgno nNewPag
369d0 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  e;      /* Numbe
369e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
369f0 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79  o after the copy
36a00 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69   */..  Pgno iSki
36a10 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  p;         /* Pe
36a20 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20  nding byte page 
36a30 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20  in pTo */.  int 
36a40 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20  nToPageSize;    
36a50 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20  /* Page size of 
36a60 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  pTo in bytes */.
36a70 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53    int nFromPageS
36a80 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69  ize;  /* Page si
36a90 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62  ze of pFrom in b
36aa0 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61  ytes */..  BtSha
36ab0 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f  red *pBtTo = pTo
36ac0 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65  ->pBt;.  BtShare
36ad0 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72  d *pBtFrom = pFr
36ae0 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f  om->pBt;.  pBtTo
36af0 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a  ->db = pTo->db;.
36b00 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20    pBtFrom->db = 
36b10 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54  pFrom->db;..  nT
36b20 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54  oPageSize = pBtT
36b30 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e  o->pageSize;.  n
36b40 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70  FromPageSize = p
36b50 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65  BtFrom->pageSize
36b60 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
36b70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
36b80 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
36b90 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
36ba0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
36bb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
36bc0 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
36bd0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
36be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
36bf0 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65  ;.  }..  nToPage
36c00 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
36c10 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  t(pBtTo->pPager)
36c20 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20  ;.  nFromPage = 
36c30 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
36c40 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b  BtFrom->pPager);
36c50 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49  .  iSkip = PENDI
36c60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36c70 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  To);..  /* Varia
36c80 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20  ble nNewPage is 
36c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
36ca0 67 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ges required to 
36cb0 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  store the.  ** c
36cc0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d  ontents of pFrom
36cd0 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
36ce0 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  nt page-size of 
36cf0 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77  pTo..  */.  nNew
36d00 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72  Page = ((i64)nFr
36d10 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46  omPage * (i64)nF
36d20 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69  romPageSize + (i
36d30 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  64)nToPageSize -
36d40 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36   1) / .      (i6
36d50 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a  4)nToPageSize;..
36d60 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
36d70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d  QLITE_OK && (i<=
36d80 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e  nToPage || i<=nN
36d90 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a  ewPage); i++){..
36da0 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74      /* Journal t
36db0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36dc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36dd0 69 53 6b 69 70 20 69 73 20 74 68 65 20 70 61 67  iSkip is the pag
36de0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
36df0 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45  locking page (PE
36e00 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29  NDING_BYTE_PAGE)
36e10 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62  .    ** in datab
36e20 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65  ase *pTo (before
36e30 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73   the copy). This
36e40 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20 77   page is never w
36e50 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69  ritten .    ** i
36e60 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
36e70 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d  file. Unless i==
36e80 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67  iSkip or the pag
36e90 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  e was not.    **
36ea0 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20   present in pTo 
36eb0 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20  before the copy 
36ec0 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e  operation, journ
36ed0 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  al page i from p
36ee0 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  To..    */.    i
36ef0 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69  f( i!=iSkip && i
36f00 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20  <=nToPage ){.   
36f10 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
36f20 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ge = 0;.      rc
36f30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
36f40 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  et(pBtTo->pPager
36f50 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , i, &pDbPage);.
36f60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36f90 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
36fa0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
36fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36fc0 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a   i>nFromPage ){.
36fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61            /* Yea
36fe0 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65  h.  It seems wie
36ff0 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57  rd to call DontW
37000 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74  rite() right aft
37010 65 72 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a  er Write(). But.
37020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
37030 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  t is because the
37040 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20   names of those 
37050 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f  procedures do no
37060 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20  t exactly .     
37070 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e       ** represen
37080 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20  t what they do. 
37090 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20   Write() really 
370a0 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20  means "put this 
370b0 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20  page in the.    
370c0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
370d0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
370e0 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
370f0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
37100 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  e written.      
37110 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
37120 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65  tabase file late
37130 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29  r."  DontWrite()
37140 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f   undoes the seco
37150 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20  nd part of.     
37160 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64       ** that and
37170 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
37180 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  ge from being wr
37190 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
371a0 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20  abase. The.     
371b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
371c0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c  still on the rol
371d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
371e0 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74  hough.  And that
371f0 20 69 73 20 74 68 65 20 0a 20 20 20 20 20 20 20   is the .       
37200 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e     ** whole poin
37210 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a  t of this block:
37220 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e   to put pages on
37230 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
37240 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20  urnal. .        
37250 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
37260 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37270 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67  DontWrite(pDbPag
37280 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37290 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
372a0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
372b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
372c0 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
372d0 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61  e the data in pa
372e0 67 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67  ge i of the targ
372f0 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  et database */. 
37300 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37310 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70  E_OK && i!=iSkip
37320 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20   && i<=nNewPage 
37330 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65  ){..      DbPage
37340 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20   *pToPage = 0;. 
37350 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
37360 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20  64 iOff;..      
37370 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37380 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  rGet(pBtTo->pPag
37390 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29  er, i, &pToPage)
373a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
373b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
373c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
373d0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50  3PagerWrite(pToP
373e0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  age);.      }.. 
373f0 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20       for(.      
37400 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f    iOff=(i-1)*nTo
37410 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
37420 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
37430 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61   && iOff<i*nToPa
37440 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20  geSize; .       
37450 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
37460 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a  geSize.      ){.
37470 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
37480 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20  pFromPage = 0;. 
37490 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f         Pgno iFro
374a0 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50  m = (iOff/nFromP
374b0 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20  ageSize)+1;..   
374c0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
374d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
374e0 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20  E(pBtFrom) ){.  
374f0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
37500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
37510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37520 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
37530 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d  m->pPager, iFrom
37540 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  , &pFromPage);. 
37550 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
37560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37570 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20        char *zTo 
37580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
37590 74 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a  tData(pToPage);.
375a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
375b0 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50  zFrom = sqlite3P
375c0 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f  agerGetData(pFro
375d0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
375e0 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20    int nCopy;..  
375f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f          if( nFro
37600 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61  mPageSize>=nToPa
37610 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
37620 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28        zFrom += (
37630 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
37640 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e  e - ((iFrom-1)*n
37650 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a  FromPageSize));.
37660 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70              nCop
37670 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b  y = nToPageSize;
37680 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
37690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
376a0 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29  o += (((iFrom-1)
376b0 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20  *nFromPageSize) 
376c0 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53  - (i-1)*nToPageS
376d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
376e0 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50    nCopy = nFromP
376f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
37700 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
37710 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f  memcpy(zTo, zFro
37720 6d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  m, nCopy);.     
37730 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
37740 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65  rUnref(pFromPage
37750 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37760 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
37770 70 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  pToPage ){.     
37780 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
37790 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
377a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
377b0 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
377c0 20 20 70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b    p->isInit = 0;
377d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
377e0 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61  PagerUnref(pToPa
377f0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
37800 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
37810 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b  things have work
37820 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64  ed so far, the d
37830 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
37840 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a   need to be .  *
37850 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  * truncated. The
37860 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73   complex part is
37870 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65   that it may nee
37880 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  d to be truncate
37890 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65  d to.  ** a size
378a0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20   that is not an 
378b0 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
378c0 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20   of nToPageSize 
378d0 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  - the current.  
378e0 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  ** page size use
378f0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
37900 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42  ssociated with B
37910 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a  -Tree pTo..  **.
37920 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
37930 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d 73  , say the page-s
37940 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30  ize of pTo is 20
37950 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  48 bytes and the
37960 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20   original .  ** 
37970 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37980 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65  is 5 (10 KB file
37990 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20  ). If pFrom has 
379a0 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31  a page size of 1
379b0 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20  024 .  ** bytes 
379c0 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68 65  and 9 pages, the
379d0 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73  n the file needs
379e0 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
379f0 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20   to 9KB..  */.  
37a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37a10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72  K ){.    if( nFr
37a20 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50  omPageSize!=nToP
37a30 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
37a40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
37a50 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
37a60 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70  gerFile(pBtTo->p
37a70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36  Pager);.      i6
37a80 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e  4 iSize = (i64)n
37a90 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28  FromPageSize * (
37aa0 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20  i64)nFromPage;. 
37ab0 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20       i64 iNow = 
37ac0 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e  (i64)((nToPage>n
37ad0 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65  NewPage)?nToPage
37ae0 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36  :nNewPage) * (i6
37af0 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  4)nToPageSize; .
37b00 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64 69        i64 iPendi
37b10 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49  ng = ((i64)PENDI
37b20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
37b30 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f  To)-1) *(i64)nTo
37b40 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20  PageSize;.  .   
37b50 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65     assert( iSize
37b60 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20  <=iNow );.  .   
37b70 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61     /* Commit pha
37b80 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65  se one syncs the
37b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
37ba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
37bb0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  o .      ** cont
37bc0 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69  aining the origi
37bd0 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65  nal data. It doe
37be0 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64  s not sync the d
37bf0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
37c00 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66     ** itself. Af
37c10 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69  ter doing this i
37c20 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
37c30 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e   OsTruncate() an
37c40 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  d other.      **
37c50 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68   file APIs on th
37c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37c70 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20  directly..      
37c80 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  */.      pBtTo->
37c90 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
37ca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37cb0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
37cc0 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  One(pBtTo->pPage
37cd0 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20  r, 0, 0, 1);.   
37ce0 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f     if( iSize<iNo
37cf0 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  w && rc==SQLITE_
37d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
37d10 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
37d20 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a  cate(pFile, iSiz
37d30 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  e);.      }.  . 
37d40 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
37d50 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61 74   that copied dat
37d60 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  a from database 
37d70 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64  pFrom to pTo did
37d80 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f   not.      ** po
37d90 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69  pulate the locki
37da0 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61 62  ng page of datab
37db0 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20  ase pTo. If the 
37dc0 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20  page-size of.   
37dd0 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73     ** pFrom is s
37de0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
37df0 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65   of pTo, this me
37e00 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69  ans some data wi
37e10 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  ll.      ** not 
37e20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64  have been copied
37e30 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
37e40 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    ** This block 
37e50 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73 69  copies the missi
37e60 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ng data from dat
37e70 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
37e80 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69  To .      ** usi
37e90 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68  ng file APIs. Th
37ea0 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
37eb0 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  se at this point
37ec0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20   we know that.  
37ed0 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68      ** all of th
37ee0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  e original data 
37ef0 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65  from pTo has bee
37f00 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  n synced into th
37f10 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
37f20 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69  nal file. At thi
37f30 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
37f40 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61   be safe to do a
37f50 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20  nything at.     
37f60 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64   ** all to the d
37f70 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78 63  atabase file exc
37f80 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74 20  ept truncate it 
37f90 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20  to zero bytes.. 
37fa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
37fb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37fc0 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  && nFromPageSize
37fd0 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20  <nToPageSize && 
37fe0 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b  iSize>iPending){
37ff0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
38000 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a  f;.        for(.
38010 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69            iOff=i
38020 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20  Pending; .      
38030 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
38040 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64  K && iOff<(iPend
38050 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29  ing+nToPageSize)
38060 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ; .          iOf
38070 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69  f += nFromPageSi
38080 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ze.        ){.  
38090 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
380a0 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20  pFromPage = 0;. 
380b0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
380c0 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f  rom = (iOff/nFro
380d0 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20  mPageSize)+1;.  
380e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
380f0 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  From==PENDING_BY
38100 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29  TE_PAGE(pBtFrom)
38110 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50   || iFrom>nFromP
38120 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
38130 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
38140 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
38150 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
38160 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
38170 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f  om->pPager, iFro
38180 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a  m, &pFromPage);.
38190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
381a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
381b0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
381c0 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33  *zFrom = sqlite3
381d0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72  PagerGetData(pFr
381e0 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
381f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
38200 33 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20  3OsWrite(pFile, 
38210 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65  zFrom, nFromPage
38220 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20  Size, iOff);.   
38230 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
38240 50 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d  PagerUnref(pFrom
38250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
38260 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
38270 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
38280 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
38290 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  se file */.     
382a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
382b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
382c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
382d0 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ync(pBtTo->pPage
382e0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
382f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
38300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
38310 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50  uncate(pBtTo->pP
38320 61 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b  ager, nNewPage);
38330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
38340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38350 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67        pBtTo->pag
38360 65 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a  eSizeFixed = 0;.
38370 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
38380 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
38390 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
383a0 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pTo);.  }..  ret
383b0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20  urn rc;  .}.int 
383c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79  sqlite3BtreeCopy
383d0 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c  File(Btree *pTo,
383e0 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a   Btree *pFrom){.
383f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
38400 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54  te3BtreeEnter(pT
38410 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  o);.  sqlite3Btr
38420 65 65 45 6e 74 65 72 28 70